Danh sách bài viết trong series Terraform Associate (003)
- Bài 0: Giới Thiệu Series Và Tổng Quan Về Chứng Chỉ Terraform Associate (003)
- Bài 1: Terraform Là Gì? Tổng Quan Và Vai Trò Trong IaC
- Bài 2: Cài Đặt Terraform Trên Các Hệ Điều Hành
- Bài 3: Terraform Workflow: Init, Plan, Apply, Destroy
- Bải 4: Terraform CLI Nâng Cao: Lệnh Taint, Import, Refresh
- Bài 5: Quản Lý Provider Trong Terraform
- Bài 6: Quản Lý Resource Trong Terraform
- Bài 7: Sử Dụng Biến (Variables) Trong Terraform
- Bài 8: Sử Dụng Output Trong Terraform
- Bài 9: Hiểu Terraform State Quản Lý Trạng Thái Hạ Tầng
- Bài 10: Sử Dụng Remote State Với Backend Như S3 Trong Terraform
- Bài 11: Terraform Workspace Quản Lý Nhiều Môi Trường
- Bài 12: Terraform Module: Mô-đun Hóa Cấu Hình
- Bài 13: Terraform Data Sources Truy Vấn Thông Tin Hạ Tầng
- Bài 14: Quản Lý Vòng Đời Tài Nguyên Với Terraform
- Bài 15: Tự Động Hóa Và Tích Hợp CI/CD Với Terraform
- Bài 16: Xử Lý Lỗi Và Debug Trong Terraform
- Bài 17: Tối Ưu Hóa Hiệu Suất Với Terraform
- Bài 18: Bảo Mật Cấu Hình Terraform
- Bài 19: Triển Khai Hạ Tầng Đa Vùng Với Terraform
- Bài 20: Triển Khai Hạ Tầng Serverless Với Terraform
- Bài 21: Triển Khai Hạ Tầng Container Với Terraform (ECS, EKS)
- Bài 22: Triển Khai Hạ Tầng Multi-Cloud Với Terraform
- Bài 23: Tổng Kết Series Và Chuẩn Bị Cho Kỳ Thi Terraform Associate (003)
Vòng Đời Tài Nguyên Trong Terraform Là Gì?

Vòng đời tài nguyên trong Terraform là chu trình quản lý tài nguyên hạ tầng, bao gồm các giai đoạn: tạo (create), cập nhật (update), và xóa (destroy). Terraform sử dụng file trạng thái (terraform.tfstate
) để theo dõi trạng thái tài nguyên và đảm bảo rằng hạ tầng thực tế khớp với cấu hình đã khai báo. Quản lý vòng đời tài nguyên là một phần cốt lõi của Terraform, giúp kiểm soát hành vi của tài nguyên trong suốt quá trình triển khai, một kỹ năng quan trọng được kiểm tra trong kỳ thi Terraform Associate (003), liên quan đến mục tiêu 5 (Interact with Terraform Modules) và mục tiêu 6 (Implement and Maintain State).
Các Giai Đoạn Trong Vòng Đời Tài Nguyên
Tạo Tài Nguyên
- Mô tả: Giai đoạn tạo tài nguyên xảy ra khi chạy
terraform apply
lần đầu hoặc khi thêm tài nguyên mới vào cấu hình. - Ví dụ:
resource "aws_instance" "web_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "WebServer" } }
- Input:
terraform apply -auto-approve
-
Output:
aws_instance.web_server: Creating... aws_instance.web_server: Creation complete after 45s [id=i-1234567890abcdef0] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Cập Nhật Tài Nguyên
- Mô tả: Giai đoạn cập nhật xảy ra khi thay đổi thuộc tính của tài nguyên (VD: thay đổi
instance_type
). - Ví dụ: Thay
instance_type
từt2.micro
sangt2.medium
.resource "aws_instance" "web_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.medium" tags = { Name = "WebServer" } }
- Input:
terraform apply -auto-approve
-
Output:
aws_instance.web_server: Modifying... [id=i-1234567890abcdef0] aws_instance.web_server: Modifications complete after 30s [id=i-1234567890abcdef0] Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
- Lưu ý: Một số thuộc tính (VD:
ami
) không thể cập nhật trực tiếp, sẽ yêu cầu xóa và tạo lại tài nguyên (recreate).
Xóa Tài Nguyên
- Mô tả: Giai đoạn xóa xảy ra khi chạy
terraform destroy
hoặc khi xóa tài nguyên khỏi cấu hình. - Input:
terraform destroy -auto-approve
-
Output:
aws_instance.web_server: Destroying... [id=i-1234567890abcdef0] aws_instance.web_server: Destruction complete after 30s Destroy complete! Resources: 0 added, 0 changed, 1 destroyed.
Quản Lý Vòng Đời Với Các Thuộc Tính Đặc Biệt
Sử Dụng lifecycle
Block
Block lifecycle
cho phép tùy chỉnh hành vi của tài nguyên trong các giai đoạn vòng đời:
create_before_destroy
: Tạo tài nguyên mới trước khi xóa tài nguyên cũ.prevent_destroy
: Ngăn Terraform xóa tài nguyên.ignore_changes
: Bỏ qua thay đổi trên một số thuộc tính.
Ngăn Xóa Tài Nguyên Với prevent_destroy
-
Ví dụ:
resource "aws_s3_bucket" "data_bucket" { bucket = "my-critical-bucket-20230518" tags = { Name = "DataBucket" } lifecycle { prevent_destroy = true } }
- Input:
terraform destroy -auto-approve
-
Output:
Error: Instance cannot be destroyed Resource aws_s3_bucket.data_bucket has lifecycle.prevent_destroy set, but the destroy operation was explicitly requested. To proceed with the destroy, either disable lifecycle.prevent_destroy or adjust the destroy command with appropriate arguments.
- Ý nghĩa: Ngăn xóa bucket quan trọng để tránh mất dữ liệu.
Tùy Chỉnh Cập Nhật Với create_before_destroy
-
Ví dụ: Đảm bảo không có thời gian gián đoạn khi cập nhật EC2 instance.
resource "aws_instance" "web_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "WebServer" } lifecycle { create_before_destroy = true } }
- Thay đổi
instance_type
thànht2.medium
:terraform apply -auto-approve
-
Output:
aws_instance.web_server: Creating... aws_instance.web_server: Creation complete after 45s [id=i-0new123456789] aws_instance.web_server: Destroying... [id=i-1234567890abcdef0] aws_instance.web_server: Destruction complete after 30s Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
- Ý nghĩa: Tài nguyên mới được tạo trước, sau đó tài nguyên cũ bị xóa, tránh downtime.
Xử Lý Lỗi Trong Quá Trình Quản Lý Vòng Đời
- Lỗi “Resource not found”:
- Tình huống: Tài nguyên bị xóa ngoài Terraform (VD: xóa thủ công trên AWS Console).
- Input:
terraform apply
- Output:
Error: AWS EC2 Instance i-1234567890abcdef0 not found
- Giải pháp:
- Xóa tài nguyên khỏi state:
terraform state rm aws_instance.web_server
- Chạy lại
terraform apply
để tạo mới.
- Xóa tài nguyên khỏi state:
- Lỗi xung đột state:
- Tình huống: Nhiều người cùng chỉnh sửa state.
- Giải pháp: Sử dụng remote state với khóa (DynamoDB) hoặc
terraform force-unlock
.
Ví Dụ Thực Tế: Quản Lý Vòng Đời Tài Nguyên
-
File
main.tf
:provider "aws" { region = "us-east-1" access_key = "YOUR_ACCESS_KEY" secret_key = "YOUR_SECRET_KEY" } data "aws_ami" "latest_amazon_linux" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } } resource "aws_s3_bucket" "data_bucket" { bucket = "my-critical-bucket-20230518" tags = { Name = "DataBucket" } lifecycle { prevent_destroy = true } } resource "aws_instance" "web_server" { ami = data.aws_ami.latest_amazon_linux.id instance_type = "t2.micro" tags = { Name = "WebServer" } lifecycle { create_before_destroy = true ignore_changes = [tags] } depends_on = [aws_s3_bucket.data_bucket] } output "bucket_name" { value = aws_s3_bucket.data_bucket.bucket } output "instance_id" { value = aws_instance.web_server.id }
-
Quy trình:
-
Tạo tài nguyên:
terraform init terraform apply -auto-approve
Output:
data.aws_ami.latest_amazon_linux: Reading... data.aws_ami.latest_amazon_linux: Read complete after 2s [id=ami-0c55b159cbfafe1f0] aws_s3_bucket.data_bucket: Creating... aws_s3_bucket.data_bucket: Creation complete after 5s [id=my-critical-bucket-20230518] aws_instance.web_server: Creating... aws_instance.web_server: Creation complete after 45s [id=i-1234567890abcdef0] Apply complete! Resources: 2 added, 0 changed, 0 destroyed. Outputs: bucket_name = "my-critical-bucket-20230518" instance_id = "i-1234567890abcdef0"
-
Cập nhật tài nguyên (thay
instance_type
thànht2.medium
):terraform apply -auto-approve
Output:
aws_instance.web_server: Creating... aws_instance.web_server: Creation complete after 45s [id=i-0new123456789] aws_instance.web_server: Destroying... [id=i-1234567890abcdef0] aws_instance.web_server: Destruction complete after 30s Apply complete! Resources: 1 added, 0 changed, 1 destroyed. Outputs: bucket_name = "my-critical-bucket-20230518" instance_id = "i-0new123456789"
-
Thử xóa tài nguyên:
terraform destroy -auto-approve
Output:
Error: Instance cannot be destroyed Resource aws_s3_bucket.data_bucket has lifecycle.prevent_destroy set, but the destroy operation was explicitly requested.
-
Xử lý lỗi tài nguyên không tồn tại (giả sử EC2 bị xóa thủ công):
terraform apply
Output:
Error: AWS EC2 Instance i-0new123456789 not found
Giải pháp:
terraform state rm aws_instance.web_server terraform apply -auto-approve
Output:
aws_instance.web_server: Creating... aws_instance.web_server: Creation complete after 45s [id=i-1new123456789] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
-
Lưu Ý Quan Trọng Khi Quản Lý Vòng Đời Tài Nguyên
- Sử dụng
lifecycle
cẩn thận: Các thuộc tính nhưcreate_before_destroy
có thể tăng chi phí nếu tài nguyên mới được tạo không cần thiết. - Sao lưu state: Luôn sao lưu file
terraform.tfstate
trước khi thực hiện thay đổi lớn. - Kiểm tra phụ thuộc: Đảm bảo tài nguyên phụ thuộc (VD: S3 bucket trước EC2) được quản lý đúng.
- Xử lý tài nguyên nhạy cảm: Sử dụng
prevent_destroy
cho tài nguyên quan trọng (VD: database, bucket lưu trữ). - Tài liệu hóa: Ghi chú rõ ràng các thuộc tính
lifecycle
để nhóm hiểu hành vi tài nguyên.
Liên Hệ Với Chứng Chỉ Terraform Associate (003)
Kỳ thi Terraform Associate (003) kiểm tra khả năng quản lý vòng đời tài nguyên. Bạn cần nắm:
- Câu hỏi mẫu:
- “Thuộc tính nào trong
lifecycle
ngăn xóa tài nguyên?”
Đáp án:prevent_destroy
. - “Hành vi của
create_before_destroy
là gì?”
Đáp án: Tạo tài nguyên mới trước khi xóa tài nguyên cũ. - “Làm thế nào để bỏ qua thay đổi trên một thuộc tính?”
Đáp án: Sử dụngignore_changes
tronglifecycle
.
- “Thuộc tính nào trong
- Thực hành: Kỳ thi có thể yêu cầu nhận diện cấu hình
lifecycle
hoặc dự đoán hành vi khi cập nhật/xóa tài nguyên.
Kết Luận
Quản lý vòng đời tài nguyên với Terraform là kỹ năng thiết yếu để triển khai và duy trì hạ tầng hiệu quả. Hiểu các giai đoạn tạo, cập nhật, xóa, và sử dụng block lifecycle
, cùng với thực hành thực tế, sẽ giúp bạn tự tin thi đỗ Terraform Associate (003). Ở bài tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng Terraform để tự động hóa và tích hợp CI/CD.