search

04-Terraform Workflow – init, plan, apply, destroy

calendar_today Đăng ngày: 29/04/2025

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

05-Terraform State là gì? Tại sao nó quan trọng?

17-Terraform Logs – Debug hạ tầng khi có sự cố

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ự.

Terraform Workflow tổng quan

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.hcl nên được commit lên Git để cả team dùng chung phiên bản Provider. Ngược lại, terraform.tfstateterraform.tfstate.backup khô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ằng terraform plan -refresh-only khi 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: initplanapplydestroy. 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