ปกติแล้วภายในหนึ่ง virtual machine นั้น เราสามารถสร้างทั้ง web application และ database ให้อยู่ด้วยกันได้ แต่บทความนี้จะสาธิตการประยุกต์ใช้ Terraform ในการสร้าง infrastructure โดยแยก web application และ database ให้อยู่คนละส่วนกัน
ในตัวอย่างจะสาธิตการใช้งาน MySQL Managed Databases ซึ่งหมายความว่า ผู้ใช้ไม่ต้องติดตั้ง MySQL เอง เนื่องจากทาง cloud provider (DigitalOcean) จะเป็นผู้จัดการเบื้องหลังให้เราทั้งหมด
ส่วนของ application จะใช้ Wordpress, เนื่องจากจุดประสงค์หลักของบทความนี้เพื่อต้องการสาธิตความง่ายในการใช้งาน database ที่เป็น "Managed Databases"
หัวข้อของบทความนี้
- สร้าง VM ของ web app และสร้าง MySQL Managed Databases โดย Terraform
- Configure ตัว web app (WordPress) ให้เชื่อมต่อกับ MySQL Managed Databases
สร้าง VM ของ web app และ MySQL Managed Databases โดย Terraform
จากรูปด้านล่าง จะสาธิตการสร้าง infra แบบง่ายๆโดยให้มีเงื่อนไขดังนี้
- Web Application (Wordpress) จะให้เข้าถึงได้จากทาง public internet ที่ port 80 และ 443 เท่านั้น (port 22 สำหรับ SSH จะถูกปิดใช้งานภายหลัง)
- MySQL ซึ่งเป็น Managed Database เข้าถึงได้จาก Web Application (Wordpress) เท่านั้น สร้างไฟล์ "droplet.tf" ขึ้นมา แล้วเขียนไฟล์ HCL ดังตัวอย่างด้านล่างนี้
ซึ่งถ้าผู้อ่านได้อ่านบทความก่อนหน้า เรื่อง "เริ่มต้น Infrastructure as Code ด้วย Terraform และ DigitalOcean" จะพบว่า HCL code นี้มีความใกล้เคียงกัน ที่ต่างกันมีดังนี้
- ที่ VM ชื่อ "my-wordpress-01" จะใช้ image ชื่อว่า "wordpress-20-04" เนื่องจากว่า image ตัวนี้ถูกติดตั้ง Apache web server และ Wordpress ไว้แล้ว
- มี HCL block ของ "digitalocean_database_cluster" เพิ่มเข้ามา
สร้าง "firewall_private.tf" ซึ่งจะเป็น Firewall rule ให้กับ mysql-cluster และมี HCL code ดังนี้
จาก HCL code ดังกล่าว ซึ่งเป็นการทำ Firewall rule เฉพาะของ Managed Database โดยจะให้เข้าถึงได้จาก IP วง 10.10.10.0/24 และเข้าถึงได้จาก droplet ที่ชื่อว่า "my-wordpress-01" เท่านั้น
จากนั้นสร้างไฟล์ชื่อว่า "firewall_public.tf" แล้วเขียน HCL code ด้านล่าง
ที่ Inbound rules : เข้าถึงได้ด้วย port 80, 443 และ 22 (port 22 นี้จะปิดภายหลัง)
ที่ Outbound rules : ได้ทุก port
จากนั้นให้ apply โดยคำสั่ง "terraform apply"
เมื่อผู้ใช้เข้าสู่หน้า console ของ DigitalOcean ก็จะพบว่ามี 2 resources
Configure ตัว web app (WordPress) ให้เชื่อมต่อกับ MySQL Managed Databases
โดย default แล้ว, ภายใน image ตัวนี้ หรือ VM ตัวนี้ ได้ถูกติดตั้ง Apache webserver, MySQL และ WordPres ไว้เรียบร้อยแล้ว แต่บทความนี้จะโฟกัสให้เห็นถึงความสะดวกในการใช้งาน Managed Database เพื่อที่จะทำให้ผู้อ่านสามารถนำไปประยุกต์ใช้กับ application ต่างๆได้
ดังนั้นผู้ใช้ก็แค่เปลี่ยน configured การเชื่อมต่อของ WordPress ให้ชี้ไปยัง MySQL Managed Database เท่านั้น
เริ่มแรกให้ทำการ SSH ไปยัง "my-wordpress-01" โดยใช้ public IP ของผู้ใช้เอง
จากนั้นจะมีการถามสิ่งต่างๆ แต่เนื่องจาก configure ที่เกิดขึ้นเราจะไม่นำมาใช้งาน ดังนั้นจึงให้ผู้ใช้กรอกข้อมูลสมมติดังตารางด้านล่าง เพื่อที่จะได้ข้ามหน้านี้ไปก่อน
Domain/Subdomain name: | aaa.com |
Your Email Address: | aaa@aaa.com |
Username: | user01 |
Password: | pass01 |
Blog Title: | myblog |
Is the information correct? [Y/n] | Y |
Would you like to use LetsEncrypt (certbot) to configure SSL(https) for your new site? (y/n): | n |
ก่อนที่จะไปแก้ไข configure file ของ WordPress ให้ไปนำข้อมูลการเชื่อมต่อของ MySQL โดยที่ที่หน้า console -> mysql-cluster จากนั้นคลิกที่ tab "VPC network" ดังรูปด้านล่าง ซึ่งผู้ใช้ก็จะเห็นข้อมูลการเชื่อมต่อมายัง MySQL
ให้ไปแก้ไขไฟล์ configure ของ WordPress โดยใช้คำสั่ง
โดยจะแก้ที่ DB_NAME , DB_USER , DB_PASSWORD และ DB_HOST เท่านั้น
และตรงที่ DB_HOST มี port 25060 ด้วย
เมื่อแก้ไขเสร็จให้ save โดยกดกด CTRL+X จากนั้นพิมพ์ Y
จากนั้นไปที่ browser แล้วไปที่ public IP ของ WordPress , ซึ่งผู้ใช้จะเจอกับหน้า configure จริงๆของ WordPress ให้ผู้ใช้กรอกข้อมูลตามที่ผู้ใช้ต้องการ
จากนั้นให้ Login เข้าสู่ WordPress
จากนั้นให้ลองสังเกตุที่หน้า Log&Queries ของ MySQL Managed Service ซึ่งจะพบว่ามี Log ต่างเกิดขึ้น
หลังจากที่ configure ทุกอย่างเสร็จแล้ว, ผู้ใช้ควรที่จะปิด port 22 เพื่อไม่ให้มีการ SSH จาก public internet โดยให้ทำการ comment ในส่วนของ port 22 ดัง HCL ด้านล่าง เสร็จแล้วก็ให้ทำการ apply โดย "terraform apply"
Code ของตัวอย่างนี้ -> https://github.com/JasTelCloud/Create-Infra-of-WebApp-Database-using-Terraform
สนใจ solutions เกี่ยวกับ cloud หรือ Infrastructure as Code ติดต่อ : cloudsale@jastel.co.th