Lesson 1Write Plan Apply

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

  1. Provider ต่างจาก Resource อย่างไร?
  2. ทำไมต้องอ่าน Terraform plan ก่อน apply?
  3. Variable, Local และ Output แก้ปัญหาอะไร?