หัวข้อของบทความนี้
- การเพิ่ม VM โดยใช้วิธี Infrastructure as Code
- การเพิ่ม VPC
- การแยก zone โดยการกำหนด Firewall rules/Security Group
การเพิ่ม VM โดยใช้วิธี Infrastructure as Code
จากบทความก่อนหน้า [เริ่มต้น Infrastructure as Code ด้วย Terraform และ DigitalOcean] ได้สาธิตการสร้างหนึ่ง VM (หรือ Droplet) ของ DigitalOcean ซึ่ง VM ดังกล่าวเป็น
Image | : Ubuntu 18.04 |
vCPU | : 1 |
RAM | : 1 |
ดัง code ด้านล่างนี้
ในบทความนี้เราลองเพิ่ม VM ขึ้นมา ให้เป็น VM ตัวที่ 2 ซึ่งมี requirement ดังนี้
Image | : Ubuntu 20.04 |
vCPU | : 2 |
RAM | : 2 |
สำหรับชื่อ image หรือชื่อ slug ของ Ubuntu 20.04 คือ "ubuntu-20-04-x64"
และชื่อ slug ของ size คือ "s-2vcpu-2gb"
( อ้างอิงจาก : https://slugs.do-api.dev/ )
ดังนั้น block ของ code ของ VM ตัวที่ 2 คือดังนี้
ให้ทำการเพิ่ม block ของ code ของ VM ตัวที่ 2 ดังกล่าวรวมเข้ากับไฟล์ก่อนหน้า
เพิ่มเติม : การจัดการ block และไฟล์ .tf ของ HCL ของ Terraform เบื้องต้นมีดังนี้
1. เราสามารถแยก block ของ code ให้อยู่คนละไฟล์ได้
2. ชื่อของไฟล์ สามารถตั้งเป็นอะไรก็ได้ ขอให้มีนามสกุลเป็น .tf
(สำหรับนามสกุล .tfvar หรือนามสกุล .json อาจกล่าวถึงในบทความอื่น)
3. ทุกไฟล์ (.tf) ขอให้อยู่ใน folder เดียวกัน , ไม่อยู่ใน sub folder
หลังจากเขียน HCL เสร็จ ก็ให้ทำการใช้คำสั่ง "terraform apply" แล้วดูผลลัพธ์ทางหน้า console ของ DigitalOcean
การเพิ่ม VPC
โดย default ของ DigitalOcean แล้ว ถ้าเราไม่ได้กำหนด VPC (Virtual Private Cloud) ตัว VM (Droplet) ทั้งหมดจะถูกสร้างที่ "Default VPC"
จากหน้า console เข้าไปดูได้ที่ Network > VPC ดังรูปด้านล่าง
ประโยชน์ของ VPC เช่น สมมติว่า account ของ DigitalOcean ของเรามีหลายๆ project ซึ่งเราต้องการแยก network กันอย่างชัดเจน ดังนั้น แต่ละ project ก็ต้องอยู่คนละ VPC
** DigitalOcean ณ ขณะนี้ยังไม่สามารถย้าย VM เข้าไปอยู่ VPC อื่นได้ **
** ชื่อของ "Default VPC" จะเปลี่ยนไม่ได้
จุดประสงค์ของตัวอย่างนี้คือจะให้มี VPC ชื่อว่า "myvpc01" และมีสอง VM ดัง diagram ด้านล่าง
จากตัวอย่างนี้จะเพิ่ม HCL block ของ VPC ด้านล่างนี้ลงไปใน code
ส่วน HCL block ของ VM ทั้งสองก่อนหน้า ให้เพิ่มบรรทัดนี้ลงไป
จากนั้นให้ทำการ apply โดยคำสั่ง "terraform apply"
ถ้าไปดูที่ Network > VPC ดังรูปด้านล่าง จะเห็นว่า มีสอง VM ถูกย้ายจาก Default VPC ไปยัง VPC ใหม่แล้ว
** แต่สิ่งที่เกิดขึ้นกับ Digital Ocean คือ VM (Droplet) จะถูกลบจาก Default VPC แล้วถูกสร้างขึ้นใหม่ที่ "myvpc01" VPC **
ดังนั้นการเริ่มต้นออกแบบ cloud infrastructure และการรู้จักพฤติกรรมของ cloud นั้นๆจึงเป็นสิ่งสำคัญ
การแยก zone โดยการกำหนด Firewall rules/Security Group
การแยก zone ของ VM หรือ Droplet มีประโยชน์หลักในเรื่องของความปลอดภัย ตัวอย่างเช่น บาง VM เราต้องการให้เข้าถึงได้จาก public internet บาง VM เราไม่ต้องการให้เข้าถึงได้จาก internet
สำหรับการแบ่ง zone ของ VM อาจจะแบ่งโดยกำหนดให้แต่ละ VM อยู่คนละวง IP แล้วกำหนด Routing ให้บาง protocols/port เฉพาะสำหรับแต่ละวง IP ให้สื่อสารกันได้
แต่สำหรับตัวอย่างนี้ จะขอสาธิตการแบ่ง zone แบบง่ายๆ ดัง diagram ด้านล่าง
- ให้ myDroplet01 สามารถเข้าถึงได้จาก public internet โดยการกำหนด Firewall rules ชื่อ "public-rules"
- ให้ newDroplet02 เข้าถึงได้โดย myDroplet01 เท่านั้น และไม่สามารถเข้าถึงได้จาก public internet
ในส่วนของ .tf , ก่อนอื่นแนะนำให้เพิ่มไฟล์ชื่อว่า "firewall_private.tf" และ "firewall_public.tf" เพื่อให้ง่ายในการจัดการ
สำหรับ firewall_private.tf จะกำหนด Firewall rules ให้กับ newDroplet02
Inbound rules : เข้าถึงได้ด้วย port 22 และ ICMP โดย IP วง 10.10.10.0/24
Outbound rules : ไม่มี
(แปลว่าที่ public internet จะเข้าถึงไม่ได้) ดัง HCL ด้านล่าง
สำหรับ firewall_public.tf จะกำหนด Firewall rules ให้กับ myDroplet01
ซึ่งสามารถเข้าถึงได้โดย public internet โดย port 22, ICMP
Inbound rules : เข้าถึงได้ด้วย port 22 และ ICMP โดย public
Outbound rules : ที่ VM ตัวนี้สามารถใช้ port 22 และ ICMP วิ่งไปข้างนอกได้
ดัง HCL ด้านล่าง
จากนั้นให้ apply โดยคำสั่ง "terraform apply"
แล้วทำการทดสอบดังนี้
- ทดสอบ SSH ไปยัง VM ทั้งสองจาก public internet
- ทดสอบ Ping ไปยัง VM ทั้งสองจาก public internet
- เมื่อ SSH เข้าไปยัง "myDroplet01" ให้ลอง Ping ไปยังไปยัง "newDroplet02"
(ถ้าต้องการ SSH จาก "myDroplet01" ไปยัง "newDroplet02" แนะนำให้สร้าง user ที่
"newDroplet02" แบบไม่ใช้ SSH Key ก่อน)
Code ของตัวอย่างนี้ -> https://github.com/JasTelCloud/Start-Infrastructure-as-Code-using-Terraform-and-DigitalOcean
สนใจ solutions เกี่ยวกับ cloud หรือ Infrastructure as Code ติดต่อ : cloudsale@jastel.co.th