หลังจากเข้าใจวิธีสร้าง module ด้วยตัวเองแล้ว อีกด้านหนึ่งที่สำคัญไม่แพ้กันคือการใช้ module ที่คนอื่นเขียนไว้แล้วผ่าน Registry สาธารณะ การเลือกใช้ module สำเร็จรูปจะช่วยประหยัดเวลาได้มาก ไม่ต้องเขียน resource พื้นฐานซ้ำ เช่น VPC, RDS หรือ Kubernetes cluster เพราะ module เหล่านี้ถูกทดสอบและใช้งานในโปรเจกต์จำนวนมาก
อย่างไรก็ตาม การเลือก module ที่ไม่เหมาะสมหรือไม่ได้รับการดูแลอาจทำให้โปรเจกต์เจอปัญหาในภายหลัง บทความนี้จะอธิบายวิธีค้นหา module, ประเมินคุณภาพ, การล็อก version และแนวทางจัดการ module ที่ใช้ในองค์กร
Terraform Registry คืออะไร
Terraform Registry เป็นแหล่งรวม module และ provider ที่เปิดให้ใช้งานฟรี โดย HashiCorp ดูแลอยู่ที่ registry.terraform.io นอกจาก module จาก HashiCorp เองแล้ว ยังมี module จาก community, บริษัทคลาวด์ใหญ่ ๆ และ vendor ต่าง ๆ ที่ publish module ของตัวเองไว้
- Public Registry — ใช้ได้ฟรี ทุกคนเข้าถึงได้
- Private Registry — ส่วนของ Cloud/Enterprise edition สำหรับ module ภายในองค์กร
- Verified Provider — ทำโดย HashiCorp หรือ partner ที่ได้รับการรับรอง
- Community Module — ผู้พัฒนาทั่วไป publish ได้ทันทีจาก GitHub
ค้นหาและใช้งาน Module
รูปแบบการอ้างอิง module ใน Registry คือ NAMESPACE/NAME/PROVIDER เมื่อเจอ module ที่ต้องการแล้ว หน้าเอกสารจะแสดง input/output, ตัวอย่าง code และ version ที่มีให้
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.1"
name = "production-vpc"
cidr = "10.0.0.0/16"
azs = ["ap-southeast-1a", "ap-southeast-1b", "ap-southeast-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
single_nat_gateway = true
enable_dns_hostnames = true
tags = {
Environment = "prod"
Terraform = "true"
}
}
เลือก Module ที่มีคุณภาพ
ไม่ใช่ทุก module ใน Registry จะเหมาะกับโปรเจกต์ของคุณ มีเกณฑ์หลักที่ควรพิจารณาก่อนตัดสินใจ
- ผู้ดูแล — publisher เป็นใคร (HashiCorp, AWS, community ใหญ่ ๆ น่าเชื่อถือกว่า)
- ความถี่ของ release — มี version ใหม่ภายใน 6-12 เดือนที่ผ่านมาหรือไม่
- Issue และ PR — เปิดค้างนานหรือเปล่า ทีมตอบกลับเร็วไหม
- Download count — module ที่มีคนใช้มากเจอ edge case มาแล้วเยอะ
- README และ examples — ถ้าเอกสารดีการเริ่มต้นจะง่าย
- Test coverage — มี CI และ automated test ไหม
Version Pinning เสมอ
การ pin version เป็นกฎสำคัญสำหรับ production เพราะ module อาจเปลี่ยนแปลงพฤติกรรมใน major release ถ้าไม่ pin เมื่อ caller รัน terraform init -upgrade อาจได้ module ใหม่ที่ทำลาย infrastructure ได้
# เลือกวิธีใดวิธีหนึ่ง
# 1. Pin version ตายตัว (เหมาะกับ production)
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.1.2"
}
# 2. Pin major version (อัพเดต minor/patch อัตโนมัติ)
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.1" # >= 5.1.0, < 6.0.0
}
# 3. กำหนดช่วง (ยืดหยุ่น แต่ต้องระวัง breaking change)
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = ">= 5.0, < 6.0"
}
Module ยอดนิยมใน Registry
กลุ่ม module ที่มีการใช้งานสูงและมีคุณภาพน่าเชื่อถือ
terraform-aws-modules/vpc/aws— สร้าง VPC พร้อม subnet, NAT, IGWterraform-aws-modules/eks/aws— สร้าง EKS clusterterraform-aws-modules/rds/aws— สร้าง RDS instance แบบ production-readyterraform-aws-modules/security-group/aws— จัดการ security groupterraform-aws-modules/alb/aws— สร้าง Application Load BalancerAzure/compute/azurerm— สร้าง Virtual Machine บน AzureGoogleCloudPlatform/network/google— สร้าง VPC บน GCP
Private Registry สำหรับองค์กร
ทีมที่ใช้ Cloud หรือ Enterprise edition สามารถ publish module ภายในองค์กรเองได้ เหมาะสำหรับ module ที่มี logic เฉพาะของบริษัท ไม่ต้องการให้เปิดเป็น public การเรียกใช้ใช้รูปแบบ hostname แทน registry สาธารณะ
module "internal_auth" {
source = "app.terraform.io/mycompany/auth/aws"
version = "1.4.0"
auth_provider = "okta"
environment = "production"
}
สรุป
Terraform Registry ช่วยประหยัดเวลาด้วย module สำเร็จรูปที่ผ่านการทดสอบจากผู้ใช้จำนวนมาก การเลือก module ที่ดีต้องดูผู้ดูแล ความถี่ release และคุณภาพเอกสาร การ pin version เป็นกฎเหล็กของ production เพื่อป้องกันการเปลี่ยนแปลงที่ไม่คาดคิด สำหรับ logic เฉพาะขององค์กรสามารถใช้ Private Registry บน Terraform Cloud/Enterprise ได้ บทความถัดไปจะเริ่มลงลึกเรื่อง workspace และการจัดการ environment หลายตัวในโปรเจกต์เดียว

