Sau khi đã hiểu terraform là gì và State hoạt động ra sao, bài này mình đi vào phần thực hành: terraform workflow từ lúc viết config đến lúc destroy hạ tầng. Mình sẽ dùng ví dụ tạo EC2 trên AWS để minh họa từng bước.
Xem thêm:
03-Terraform Provider là gì? Tại sao bắt buộc phải có Provider
1. Terraform Workflow tổng quan
Quy trình làm việc với Terraform đi theo thứ tự cố định:
Viết file .tf → terraform init → terraform plan → terraform apply → terraform destroy
Mỗi bước có vai trò riêng, không thể bỏ qua hay đảo thứ tự.

2. Ví dụ thực hành: Tạo EC2 trên AWS
Trước khi đi vào từng lệnh, tạo thư mục làm việc và file config:
mkdir ec2-demo && cd ec2-demo
touch main.tf
Nội dung main.tf:
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "hello" {
ami = "ami-09dd2e08d601bff67"
instance_type = "t2.micro"
tags = {
Name = "HelloWorld"
}
}
terraform init
Lệnh đầu tiên bạn phải chạy trong bất kỳ project Terraform nào.
terraform init
init sẽ làm 3 việc:
- Đánh dấu thư mục hiện tại là một Terraform project
- Tải provider, module và plugin cần thiết (ở đây là AWS provider)
- Thiết lập backend để lưu State file
Kết quả mong đợi:
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v3.68.0...
- Installed hashicorp/aws v3.68.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl...
Sau khi chạy xong, bạn sẽ thấy thư mục .terraform/ được tạo ra — đây là nơi chứa các plugin đã download. File .terraform.lock.hcl ghi lại phiên bản provider, nên commit file này lên Git để đảm bảo team dùng cùng phiên bản.
Một số options hữu ích:
# Chỉ định file backend config riêng
terraform init -backend-config=backend.hcl
# Hoặc truyền thẳng key/value
terraform init -backend-config="bucket=my-tfstate"
terraform plan
Trước khi apply bất cứ thứ gì, luôn chạy plan để xem trước Terraform sẽ làm gì.
terraform plan
Terraform đọc file .tf, so sánh với State hiện tại, rồi in ra danh sách thay đổi dự kiến:
Terraform will perform the following actions:
# aws_instance.hello will be created
+ resource "aws_instance" "hello" {
+ ami = "ami-09dd2e08d601bff67"
+ instance_type = "t2.micro"
...
}
Plan: 1 to add, 0 to change, 0 to destroy.
Ký hiệu cần nhớ:
| Ký hiệu | Ý nghĩa |
|---|---|
+ |
Resource sẽ được tạo mới |
~ |
Resource sẽ được cập nhật |
- |
Resource sẽ bị xóa |
-/+ |
Resource sẽ bị xóa rồi tạo lại |
Tip: Dùng -out để lưu plan lại, đảm bảo apply thực hiện đúng những gì plan đã tính:
terraform plan -out=tfplan
terraform apply tfplan
terraform apply
Sau khi kiểm tra plan và thấy ổn, chạy apply để triển khai thực tế:
terraform apply
Terraform sẽ hiển thị lại plan và hỏi xác nhận:
Do you want to perform these actions?
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_instance.hello: Creating...
aws_instance.hello: Still creating... [10s elapsed]
aws_instance.hello: Still creating... [30s elapsed]
aws_instance.hello: Creation complete after 42s [id=i-0c0285db1ffe968a2]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Sau khi apply xong, terraform.tfstate được cập nhật với thông tin resource vừa tạo.
Một số options hữu ích:
# Bỏ qua bước refresh state trước khi apply (nhanh hơn)
terraform apply -refresh=false
# Tạo lại một resource cụ thể (destroy rồi create lại)
terraform apply -replace=aws_instance.hello
Lưu ý quan trọng: Nếu có nhiều resource và một số bị lỗi giữa chừng, những resource đã tạo thành công không bị rollback. Terraform không có cơ chế transaction như database.
terraform destroy
Khi cần xóa toàn bộ hạ tầng:
terraform destroy
Terraform đọc State, liệt kê resource sẽ bị xóa, rồi hỏi xác nhận tương tự apply. Lệnh này không thể hoàn tác, hãy chắc chắn trước khi nhập yes.
# Xóa không cần xác nhận (dùng trong CI/CD)
terraform destroy -auto-approve
Nếu chỉ muốn xóa một phần resource thay vì toàn bộ:
# Bước 1: Loại resource KHÔNG muốn xóa ra khỏi State
terraform state rm aws_instance.hello
# Bước 2: Destroy phần còn lại
terraform destroy
Các file được sinh ra trongg project Terraform
Sau khi chạy qua các bước trong workflow, thư mục làm việc sẽ có các file sau:
| File | Sinh ra khi | Vai trò |
|---|---|---|
*.tf |
Bạn tự tạo | Chứa khai báo tài nguyên hạ tầng dưới dạng code |
.terraform/providers/.../terraform-provider-aws_v5.44.0_x5.exe |
terraform init |
File plugin để Terraform tương tác với Provider và quản lý tài nguyên |
terraform.tfstate |
terraform apply |
Lưu trạng thái hiện tại của hạ tầng |
terraform.tfstate.backup |
terraform apply lần 2 trở đi |
Bản backup của tfstate trước lần apply gần nhất, dùng để restore khi cần |
.terraform.lock.hcl |
terraform init |
Khóa version của Provider và module đang được sử dụng |
terraform.tfstate.lock.info |
Trong lúc plan/apply |
Khóa State, đảm bảo tại một thời điểm chỉ có một tiến trình hoặc một người được sửa đổi |
.terraform.lock.hclnên được commit lên Git để cả team dùng chung phiên bản Provider. Ngược lại,terraform.tfstatevàterraform.tfstate.backupkhông nên commit vì có thể chứa thông tin nhạy cảm — thêm vào.gitignore.
3. Các lệnh hỗ trợ khác
Ngoài 4 lệnh chính trong workflow, Terraform còn có một số lệnh tiện ích:
| Lệnh | Chức năng |
|---|---|
terraform validate |
Kiểm tra cú pháp và tính hợp lệ của file config |
terraform fmt |
Format lại file .tf theo chuẩn HashiCorp |
terraform state list |
Liệt kê tất cả resource đang được quản lý trong State |
terraform output |
Đọc giá trị output từ State |
terraform import |
Đưa resource có sẵn (không tạo bằng Terraform) vào State |
terraform plan -refresh-only |
Cập nhật State theo trạng thái thực tế trên cloud, không thay đổi hạ tầng |
terraform force-unlock LOCK_ID |
Mở khóa State khi bị lock do lỗi |
terraform console |
Mở interactive console để test expressions |
terraform graph |
Xuất dependency graph dạng DOT |
terraform taint |
đánh dấu một resource là “bị lỗi / cần thay thế”. Terraform destroy + recreate một resource ở lần apply tiếp theo |
terraform refreshđã bị deprecated — thay bằngterraform plan -refresh-onlykhi cần sync State với thực tế trên cloud.
Tóm lại
Workflow cơ bản của Terraform chỉ có 4 bước: init → plan → apply → destroy. Thực hành đủ với ví dụ EC2 này là bạn đã nắm được vòng đời cơ bản của một resource trong Terraform.
Bài viết thuộc series HashiCorp Certified: Terraform Associate trên ttnguyen.net. Cảm ơn bạn đã đọc