Bài giảng: hiểu luồng trước khi chạy lệnh
Bài toán: Tổ chức state theo workspace, kết nối repository và đưa variable/secret ra khỏi laptop để team làm việc an toàn hơn.
terraform fmt
terraform init
terraform validate
terraform plan
terraform apply
terraform plan -destroy
terraform destroyWorkspace là ranh giới vận hành
HCP Terraform (tên mới của Terraform Cloud) cung cấp workspace để gắn một cấu hình với một state riêng. Có thể đặt một workspace cho mỗi môi trường:
app-dev
app-staging
app-production
Đừng tạo một workspace duy nhất rồi dùng biến environment để phân biệt mọi thứ nếu quyền deploy và approval của production cần khác dev.
terraform {
cloud {
organization = "example-org"
workspaces {
name = "app-dev"
}
}
}
Sau đó:
terraform login
terraform init
terraform plan
Variable và secret
Variable không nhạy cảm có thể nằm trong workspace variables. Secret nên đánh dấu sensitive và chỉ dùng trong workspace/environment phù hợp. Không dán access key vào file .tf hay commit vào repository.
Một pattern an toàn hơn là để HCP dùng cloud dynamic credentials hoặc assume role ngắn hạn. Nếu tổ chức chưa có, dùng token có scope nhỏ và rotate đều đặn.
Remote run thay đổi cách debug
Khi workspace chạy remote, log và plan nằm trên HCP. Người review thấy cùng một kết quả từ cùng một runner, không phụ thuộc máy cá nhân. Khi có lỗi:
- Đọc bước Terraform và provider báo lỗi.
- Kiểm tra variable set, cloud role và working directory.
- So sánh commit đang chạy với commit local.
- Không chạy apply tay bằng credential admin để “bypass” quy trình.
Có thể đặt execution mode remote, local hoặc agent tùy mạng nội bộ. Agent phù hợp khi runner cần truy cập private VPC mà không mở inbound từ Internet.
Workspace mapping nên phản ánh quyền hạn
Một quy ước dễ audit:
repo: platform-infra
├── app-dev -> auto plan, apply tự động sau merge
├── app-staging -> plan tự động, apply manual
└── app-production -> plan tự động, approval + policy + change window
Tách workspace giúp state, variable và quyền apply tách nhau. Nếu dùng workspace theo branch tạm thời, phải có TTL và cleanup; nếu không, state thử nghiệm sẽ tích tụ và credential có thể bị bỏ quên.
Trước khi cho phép remote apply, test một thay đổi vô hại như tag. Kiểm tra log run, actor, commit SHA, variable set và link tới plan. Một hệ thống tốt phải trả lời được “ai đã apply cái gì, từ commit nào, vào workspace nào”.
HCP Terraform không tự làm mọi thứ an toàn
Workspace vẫn cần policy IAM, approval cho production, state retention, notification và quy ước module. Hãy coi HCP là nơi cung cấp nền tảng phối hợp; chất lượng vẫn đến từ code, review và guardrail của team.
Expected state và remote-run acceptance
Tạo workspace lab app-dev với repository/working directory/version pin rõ, execution mode được ghi, variable set tối thiểu và không có credential thật trong Git. Expected state là terraform init kết nối đúng workspace, plan chạy trên runner đã chọn, state/plan/log chỉ truy cập được người có quyền, tag-only change đi qua review và actor/commit SHA/workspace được audit.
Thực hiện các drill:
- Map nhầm repository/working directory hoặc workspace name, chạy plan và xác định trước khi apply; không để workspace production dùng nhầm branch/dev variables.
- Đánh dấu variable sensitive, kiểm tra nó không xuất hiện trong plan/log/output; revoke/rotate lab token sau khi thử và không copy token vào shell history/artifact.
- Chạy tag-only plan/apply qua approval, kiểm tra run link, actor, commit SHA, variable set, policy result và state revision; so sánh local plan với remote runner chỉ khi cùng commit/provider lock.
- Mô phỏng run bị lock/policy/credential/private-network fail, phân loại HCP configuration vs cloud IAM vs agent connectivity; không bypass bằng admin apply/local state.
Quality gate
Pass khi workspace boundary phản ánh environment/approval, execution mode/agent được chọn theo network, variables/secrets có ownership/rotation, remote plan/apply có audit evidence, state access/retention/IAM rõ và ephemeral workspace có TTL/cleanup. HCP không thay thế review, least privilege hay backup/recovery policy.