[ภาคต่อ] เริ่มต้น Infrastructure as Code ด้วย Terraform และ DigitalOcean

หัวข้อของบทความนี้

- การเพิ่ม 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 ดังรูปด้านล่าง

Blog-Terraform-DO-DefaultVPC 

ประโยชน์ของ VPC เช่น สมมติว่า account ของ DigitalOcean ของเรามีหลายๆ project ซึ่งเราต้องการแยก network กันอย่างชัดเจน  ดังนั้น แต่ละ project ก็ต้องอยู่คนละ VPC

** DigitalOcean ณ ขณะนี้ยังไม่สามารถย้าย VM เข้าไปอยู่ VPC อื่นได้ **

** ชื่อของ "Default VPC" จะเปลี่ยนไม่ได้

จุดประสงค์ของตัวอย่างนี้คือจะให้มี VPC ชื่อว่า "myvpc01" และมีสอง VM ดัง diagram ด้านล่าง Blog-Terraform-DO-CloudNetworkDiagram01

จากตัวอย่างนี้จะเพิ่ม HCL block ของ VPC ด้านล่างนี้ลงไปใน code 

ส่วน HCL block ของ VM ทั้งสองก่อนหน้า ให้เพิ่มบรรทัดนี้ลงไป 

vpc_uuid = digitalocean_vpc.vpc01.id
 
ดังนั้นไฟล์ .tf ดังกล่าวจะเป็นดังตัวอย่างด้านล่าง

จากนั้นให้ทำการ apply โดยคำสั่ง "terraform apply"

ถ้าไปดูที่ Network > VPC ดังรูปด้านล่าง จะเห็นว่า มีสอง VM ถูกย้ายจาก Default VPC ไปยัง VPC ใหม่แล้ว

Blog-Terraform-DO-NewVPC

** แต่สิ่งที่เกิดขึ้นกับ 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 

Blog-Terraform-DO-CloudNetworkDiagram-2FirewallRules

ในส่วนของ .tf , ก่อนอื่นแนะนำให้เพิ่มไฟล์ชื่อว่า "firewall_private.tf" และ "firewall_public.tf" เพื่อให้ง่ายในการจัดการ Blog-Terraform-DO-VSCode-2rules

สำหรับ 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

CloudDigitaloceanHashicorpInfrastructure-as-codeLinuxTerraform

Leave a comment

All comments are moderated before being published