Lesson 3Reuse

Modules and Environments

Module ช่วย reuse infrastructure pattern แต่ถ้าออกแบบกว้างเกินไปจะกลายเป็น black box ที่แก้ยากและเสี่ยงต่อทุก environment พร้อมกัน

Module คืออะไร

Terraform module คือชุด configuration ที่รับ inputs ผ่าน variables และส่ง outputs กลับมา ใช้สร้าง pattern ซ้ำ เช่น VPC module, ECS service module หรือ RDS module โดย root module คือ directory ที่เรารัน Terraform

Module boundary

Module ที่ดีควรครอบคลุม responsibility เดียวและมี interface ชัดเจน เช่น network module สร้าง VPC/subnets/routes, app module รับ subnet IDs/security group IDs ไปสร้าง compute ไม่ควรให้ module เดียวสร้างทั้งองค์กรตั้งแต่ network ถึง CI/CD

module "network" {
  source = "../../modules/network"

  name       = "learning-dev"
  cidr_block = "10.20.0.0/16"
  az_count   = 2
}

output "private_subnet_ids" {
  value = module.network.private_subnet_ids
}

Environment structure

โครงสร้างที่อ่านง่ายมักแยก modules/ ออกจาก envs/ และแยก state ต่อ environment เพื่อให้ dev, staging และ prod มีค่าคนละชุดแต่ใช้ module เดียวกันได้

infra/
  modules/
    network/
    web-app/
  envs/
    dev/
      main.tf
      backend.tf
      terraform.tfvars
    prod/
      main.tf
      backend.tf
      terraform.tfvars

Variables และ validation

ใช้ variable types และ validation เพื่อกันค่าผิดตั้งแต่ก่อน plan เช่น CIDR format, allowed instance types หรือ environment names Outputs ควรส่งเฉพาะค่าที่จำเป็นต่อ module อื่นหรือผู้ใช้

Best practices

  • เริ่มจาก code ตรง ๆ ก่อน ถ้ามี pattern ซ้ำจริงค่อย extract เป็น module
  • ตั้ง version ให้ shared modules โดยใช้ Git tag หรือ registry version
  • ทำ README ให้ module บอก inputs, outputs และตัวอย่างการใช้
  • แยก prod state ออกจาก dev state เสมอ
  • อย่าใช้ workspace เป็นตัวแทน environment ถ้าทีมยังควบคุม state/path/approval ไม่ชัด

Common mistakes

  • สร้าง module ที่มี flags จำนวนมากจน behavior เดายาก
  • เปลี่ยน module shared โดยไม่ดู impact ทุก caller
  • ใช้ output ส่ง sensitive data โดยไม่จำเป็น

Review questions

  1. เมื่อไรควรสร้าง Terraform module?
  2. ทำไม prod และ dev ควรแยก state?
  3. Module interface ที่ดีควรมีลักษณะอย่างไร?