Terraform: state, graph và production workflow
Terraform không chỉ là viết HCL. Vận hành an toàn phụ thuộc state ownership, provider graph, review plan, identity và recovery khi apply bị gián đoạn.
1. Core workflow
terraform fmt → init → validate → plan → review/policy → apply
↑ refresh state/remote objects ↓
state updateinit tải providers/modules và cấu hình backend; validate kiểm tra syntax/internal consistency nhưng không chứng minh credentials/quota/runtime; plan dự đoán diff tại thời điểm đó; apply thực hiện graph và cập nhật state. Saved plan giảm plan/apply mismatch nhưng vẫn cần kiểm soát stale external state.
2. Resource graph
Terraform suy dependency từ references, không từ thứ tự file. depends_on chỉ dùng cho dependency ẩn không thể biểu diễn bằng data flow. Excessive explicit dependencies làm graph tuần tự và tạo unknown values. Lifecycle như create_before_destroy, prevent_destroy và ignore_changes thay replacement/drift semantics nên phải dùng có chủ đích.
3. State và backend
State ánh xạ resource address sang remote object ID/attributes, phục vụ diff và dependency. State có thể chứa secrets dù variable được đánh dấu sensitive.
- Remote backend mã hóa, access least privilege, locking, versioning/backup và audit.
- Mỗi environment/account/blast radius có state riêng; tránh một state khổng lồ.
- Không commit
terraform.tfstate; không sửa JSON thủ công. - Dùng
state mv/rm,movedblock vàimporttheo runbook, luôn backup trước recovery.
4. Providers, modules và versions
Pin Terraform/provider constraints và commit dependency lock file. Module nhỏ có typed inputs, validation, outputs tối thiểu và version release. Root module composition thuộc environment; child module không nên tự cấu hình provider aliases mơ hồ hoặc che ownership tài nguyên.
5. Variables, locals, data sources và outputs
- Variable là input contract; locals đặt tên transformation; output công bố interface.
- Data source đọc object không do state hiện tại sở hữu; overuse tạo coupling và plan phụ thuộc môi trường.
for_eachdùng stable business keys;counttheo index dễ churn khi chèn/xóa giữa danh sách.sensitive=truechỉ redaction UI, không mã hóa state và không ngăn provider/API logs.
6. Drift, import và refactor
Drift là remote object khác desired config/state. Scheduled plan phát hiện nhưng cần quyết định: revert console change, cập nhật code, hoặc import/adopt. Import chỉ đưa object vào state; vẫn phải viết configuration khớp. Refactor address bằng moved block để tránh destroy/create ngoài ý muốn.
7. Failure và recovery
- Apply partial failure có thể đã tạo một số resources; đọc error, refresh/plan lại, không apply mù.
- State lock chỉ serialize Terraform clients dùng cùng locking backend; không ngăn console/API khác sửa resource.
- Lost/corrupt state cần backend versions/backup, provider inventory và import; đây là incident.
- Provider/API eventual consistency, timeout và quota có thể làm resource tồn tại nhưng state chưa cập nhật.
-targetlà recovery tool hạn chế, không phải workflow deploy thường xuyên vì bỏ qua full graph.
8. CI/CD guardrails
PR chạy fmt/validate/security-policy scan và tạo plan bằng read/plan identity. Apply chỉ từ reviewed revision/saved plan trong protected environment với short-lived OIDC identity. Redact plan artifacts, đặt retention/access và tách approval khỏi người sửa code khi risk cao.
9. Checklist phỏng vấn
- Giải thích state dùng để làm gì và vì sao sensitive.
- Phân biệt validate, plan và apply guarantees.
- Giải thích graph/reference với depends_on.
- Biết import không tự sinh hoàn chỉnh desired configuration.
- Phân biệt count với for_each và workspace với environment isolation.
- Mô tả recovery cho partial apply, drift và lost state.
- Thiết kế pipeline plan/apply có OIDC, policy và approval.