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 state | Remote 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 statecommand - เก็บ password หรือ generated secrets ใน resource arguments จนไหลลง state
Review questions
- Terraform state ใช้ทำอะไร?
- ทำไม remote backend สำคัญเมื่อทำงานเป็นทีม?
- State locking ป้องกันปัญหาอะไร?