Vấn đề của local state
Mặc định Terraform lưu state trong terraform.tfstate tại máy chạy lệnh. Cách này ổn cho bài lab cá nhân, nhưng nhanh chóng có vấn đề:
- Hai người có state khác nhau và không biết ai đang sở hữu resource.
- State nằm trên laptop có thể mất hoặc bị lộ.
- Hai pipeline chạy cùng lúc có thể ghi đè state.
- Người review không có một nơi chung để xem lịch sử thay đổi.
Backend quyết định state nằm ở đâu và, tùy loại backend, operation chạy ở đâu.
Ba mô hình phổ biến
Local backend: đơn giản, không cần cấu hình. Dùng cho learning hoặc prototype không có shared infrastructure.
Standard backend: state ở storage chung như S3, GCS, Azure Blob. Terraform CLI vẫn chạy ở máy/runner của bạn.
Remote backend: state và có thể cả plan/apply chạy trên dịch vụ như HCP Terraform. Dịch vụ thường cung cấp locking, variable store, policy và audit.
Ví dụ khai báo HCP Terraform:
terraform {
cloud {
organization = "my-org"
workspaces { name = "app-dev" }
}
}
Backend không phải backup duy nhất
Một remote backend tốt vẫn cần versioning, mã hóa, phân quyền và retention. State có thể chứa mật khẩu, endpoint nội bộ hoặc token dù output đã đánh dấu sensitive. Coi state như dữ liệu production.
Khi đổi backend, Terraform yêu cầu migrate state:
terraform init -migrate-state
Không chạy migrate khi chưa biết state hiện tại nằm ở đâu. Hãy backup/kiểm tra trước, thông báo team và đảm bảo chỉ một người thực hiện.
Chọn backend theo quy mô
| Tình huống | Lựa chọn thực dụng |
|---|---|
| Học cá nhân | Local |
| Team nhỏ, CI riêng | S3 + locking + versioning |
| Nhiều team, cần policy/audit | HCP Terraform |
| Quy định cloud khác | Backend native của cloud đó |
Điểm mấu chốt: backend giải quyết việc chia sẻ và khóa state, không thay thế quy trình review hay quyền IAM.
Cách migrate an toàn
Hãy coi đổi backend là một change riêng, không gộp với việc refactor resource:
- Dừng pipeline và xác nhận không có
applyđang chạy. - Sao lưu hoặc xác nhận version state hiện tại.
- Thêm block backend nhưng chưa đổi resource.
- Chạy
terraform init -migrate-state, đọc đường dẫn nguồn/đích. - Chạy
terraform planvà đảm bảo không có create/destroy bất ngờ. - Cập nhật README, credential và quyền truy cập cho team.
Nếu plan sau migrate đề xuất tạo lại mọi resource, dừng lại. Thường nguyên nhân là sai backend key, sai workspace, sai account/region hoặc provider alias.
Bản gốc: What Is a Terraform Backend?.