← Tổng quan series

Terraform Backend là gì và vì sao team cần nó?

Hiểu local state, standard backend, remote backend và cách chọn nơi lưu state khi nhiều người cùng thay đổi hạ tầng.

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:

  1. Dừng pipeline và xác nhận không có apply đang chạy.
  2. Sao lưu hoặc xác nhận version state hiện tại.
  3. Thêm block backend nhưng chưa đổi resource.
  4. Chạy terraform init -migrate-state, đọc đường dẫn nguồn/đích.
  5. Chạy terraform plan và đảm bảo không có create/destroy bất ngờ.
  6. 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?.