Lesson 2State

State, Remote Backend and Locking

Terraform state คือแผนที่ระหว่าง code กับ resource จริง ถ้า state สูญหาย, รั่ว หรือถูกแก้ผิด ระบบจะเสี่ยงทันที

State คืออะไร

Terraform ใช้ state เพื่อ map resource ใน configuration กับ real-world resource ใน AWS เช่น resource block aws_vpc.main ผูกกับ VPC ID จริง State ยังเก็บ metadata และบางครั้งอาจมีค่า sensitive จึงต้องป้องกันเหมือนข้อมูลสำคัญ

Local state vs Remote state

หัวข้อLocal stateRemote state
เหมาะกับทดลองส่วนตัวระยะสั้นทีม, CI/CD, production
Collaborationเสี่ยงชนกันและสูญหายแชร์ state ผ่าน backend
Securityขึ้นกับเครื่องผู้ใช้ใช้ IAM, encryption, versioning, access log ได้
Lockingจำกัดใช้ locking เพื่อกัน apply พร้อมกัน

S3 backend

สำหรับ AWS, pattern ที่พบบ่อยคือเก็บ state ใน S3 bucket ที่เปิด versioning, encryption และ block public access พร้อมใช้ locking mechanism ที่ backend รองรับเพื่อป้องกัน concurrent runs

terraform {
  backend "s3" {
    bucket       = "company-terraform-state"
    key          = "prod/network/terraform.tfstate"
    region       = "ap-southeast-1"
    encrypt      = true
    use_lockfile = true
  }
}

State locking

Locking ป้องกันการรัน terraform apply พร้อมกันจากหลายคนหรือหลาย pipeline ถ้าไม่มี locking state อาจถูกเขียนทับ และเกิด infrastructure drift หรือ resource loss ได้

Best practices

  • อย่า commit terraform.tfstate ลง Git
  • เปิด S3 versioning และ encryption สำหรับ state bucket
  • จำกัด IAM access ต่อ state path ตาม team/environment
  • แยก state ตาม blast radius เช่น network, app, database หรือ environment
  • backup และทดสอบ recovery ของ state bucket policy/version

Common mistakes

  • ใช้ state bucket เดียวแต่ permission กว้างเกินไปทุกทีมอ่านได้หมด
  • แก้ state JSON ด้วยมือแทนใช้ terraform state command
  • เก็บ password หรือ generated secrets ใน resource arguments จนไหลลง state

Review questions

  1. Terraform state ใช้ทำอะไร?
  2. ทำไม remote backend สำคัญเมื่อทำงานเป็นทีม?
  3. State locking ป้องกันปัญหาอะไร?