Terraform Workflow
Terraform ทำให้ infrastructure เป็น code ที่ review ได้, version ได้ และสร้างซ้ำได้ โดย workflow หลักคือ Write, Plan และ Apply
Infrastructure as Code
Infrastructure as Code หรือ IaC คือการประกาศ desired state ของ infrastructure ในไฟล์ เช่น VPC, Subnet, Security Group, IAM Role หรือ Load Balancer จากนั้น tool จะเทียบกับของจริงและสร้าง plan เพื่อทำให้ของจริงตรงกับ code
Provider, Resource และ Data Source
- Provider คือ plugin ที่ Terraform ใช้คุยกับ API เช่น AWS Provider
- Resource คือสิ่งที่ Terraform สร้างหรือจัดการ เช่น
aws_vpc,aws_instance - Data Source คือการอ่านข้อมูลที่มีอยู่แล้ว เช่น AMI ล่าสุด, VPC เดิม หรือ caller identity
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
}
data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]
}
Variable, Local และ Output
Variable รับค่าจาก environment หรือ caller, Local ใช้ตั้งค่าที่คำนวณใน module, Output ส่งค่ากลับให้คนหรือ module อื่น ใช้สามอย่างนี้เพื่อทำให้ code อ่านง่ายและลด hard-code
CLI workflow
terraform fmt
terraform init
terraform validate
terraform plan -out tfplan
terraform apply tfplan
plan คือจุดตรวจสำคัญก่อนเปลี่ยน resource จริง อย่ากด apply โดยไม่อ่านว่า Terraform จะ create, update,
replace หรือ destroy อะไร
Best practices
- รัน
fmtและvalidateก่อนเปิด Pull Request - เก็บ Terraform code ใน Git และใช้ code review เหมือน application code
- แยก change เล็กพอให้ review plan ได้จริง
- ใช้ tag naming convention ตั้งแต่ resource แรก
- หลีกเลี่ยง manual change ใน Console เพราะทำให้เกิด drift
Common mistakes
- ใช้
apply -auto-approveในเครื่องส่วนตัวโดยไม่อ่าน plan - ใส่ค่า environment-specific กระจายหลายไฟล์โดยไม่มี pattern
- ไม่ pin provider version ทำให้ behavior เปลี่ยนตอน init ครั้งถัดไป
Review questions
- Provider ต่างจาก Resource อย่างไร?
- ทำไมต้องอ่าน Terraform plan ก่อน apply?
- Variable, Local และ Output แก้ปัญหาอะไร?