TL;DR
Terraform đã hết thời gian chờ resource hoàn tất quá trình provisioning. Thêm block timeouts vào resource đó và chạy lại terraform apply — cách này giải quyết được vấn đề trong hầu hết các trường hợp.
resource "aws_eks_cluster" "main" {
name = "my-cluster"
role_arn = aws_iam_role.eks.arn
timeouts {
create = "30m"
delete = "20m"
}
}
Nguyên Nhân Gây Ra Lỗi Này
Về bản chất, terraform apply sẽ liên tục kiểm tra từng resource cho đến khi nhận được trạng thái sẵn sàng. Mỗi loại resource đều có thời gian giới hạn tích hợp sẵn — thường từ 10–40 phút tùy loại. Tạo một aws_eks_cluster thì có 30 phút; aws_db_instance mặc định là 40 phút. Nếu vượt quá giới hạn đó — do region chậm, instance lớn, hay API không ổn định — Terraform sẽ dừng lại:
Error: A resource could not be created during the last apply. The resource provisioning timed out.
Các resource thường gặp lỗi này nhất:
- Cluster EKS / GKE / AKS
- RDS instance (đặc biệt là Multi-AZ)
- ElastiCache cluster
- EC2 instance lớn có user-data script
- VPN gateway và Transit Gateway
- Kubernetes resource qua provider
kubernetes
Lưu ý quan trọng: resource có thể đã tồn tại trên cloud rồi — Terraform chỉ là hết kiên nhẫn chờ đợi. Hãy kiểm tra cloud console trước khi kết luận rằng chưa có gì được tạo ra.
Bước 1 — Kiểm Tra Những Gì Đã Được Tạo
Trước khi động vào Terraform, hãy xác minh xem resource có tồn tại trên cloud không — có thể nó chỉ đang chạy chậm mà thôi.
# Ví dụ AWS — kiểm tra xem RDS instance có tồn tại không
aws rds describe-db-instances --db-instance-identifier my-db --query 'DBInstances[*].DBInstanceStatus'
# Hoặc kiểm tra trạng thái EKS cluster
aws eks describe-cluster --name my-cluster --query 'cluster.status'
Nếu trạng thái hiển thị creating hoặc available, resource vẫn ổn — Terraform chỉ là hết thời gian chờ. Đồng bộ state trước, rồi apply:
terraform refresh
terraform apply
Bước 2 — Tăng Thời Gian Timeout
Hầu hết các loại resource trong Terraform đều chấp nhận block timeouts. Đặt nó bên trong định nghĩa resource. Các key có sẵn — create, update, delete — tùy thuộc vào từng loại resource, vì vậy hãy kiểm tra tài liệu nếu không chắc.
Ví Dụ RDS
resource "aws_db_instance" "postgres" {
identifier = "my-db"
engine = "postgres"
instance_class = "db.r5.2xlarge"
multi_az = true
allocated_storage = 100
timeouts {
create = "60m"
update = "80m"
delete = "40m"
}
}
Ví Dụ EKS Cluster
resource "aws_eks_cluster" "main" {
name = "production"
role_arn = aws_iam_role.eks.arn
vpc_config {
subnet_ids = var.subnet_ids
}
timeouts {
create = "30m"
delete = "15m"
}
}
Ví Dụ Google Cloud SQL
resource "google_sql_database_instance" "main" {
name = "my-instance"
database_version = "POSTGRES_14"
region = "us-central1"
timeouts {
create = "30m"
update = "30m"
delete = "30m"
}
settings {
tier = "db-custom-4-16384"
}
}
Lưu file và apply:
terraform apply
Bước 3 — Xử Lý State Bị Kẹt
Đôi khi Terraform để lại một entry state viết dở cho resource chưa hoàn tất provisioning. Hãy dọn dẹp trước khi thử lại.
Kiểm Tra State Hiện Tại
terraform state list
terraform state show aws_db_instance.postgres
Xóa State Mồ Côi (nếu resource không tồn tại trên cloud)
# Xóa resource lỗi khỏi state để Terraform sẽ thử tạo lại
terraform state rm aws_db_instance.postgres
Import Resource Đã Tồn Tại (nếu đã được tạo nhưng Terraform mất dấu)
# Import RDS instance hiện có vào state
terraform import aws_db_instance.postgres my-db
# Sau đó xác minh
terraform plan
Bước 4 — Điều Tra Nguyên Nhân Provisioning Chậm
Tăng giới hạn timeout chỉ là chữa triệu chứng, không phải nguyên nhân. Nếu một EKS cluster trước đây khởi động trong 15 phút mà giờ mất 45 phút, có gì đó đã thay đổi — và đáng để tìm hiểu xem là gì.
EC2 User-Data Script
Một startup script chạy hơn 10 phút sẽ giữ instance ở trạng thái pending suốt thời gian đó. Xem console output để biết nó đang bị treo ở đâu:
aws ec2 get-console-output --instance-id i-0abc123 --output text
Hãy chuyển các tác vụ khởi tạo nặng ra khỏi user-data — dùng công cụ quản lý cấu hình như Ansible hoặc Chef, hoặc đóng gói sẵn phần mềm vào custom AMI.
EBS Volume Dung Lượng Lớn
Một volume gp2 dung lượng 2TB có thể mất hơn 20 phút để khởi tạo từ đầu. Hãy chuyển sang gp3 — loại này cung cấp 3.000 IOPS baseline bất kể dung lượng, và quá trình khởi tạo hoàn tất nhanh hơn đáng kể. Với các workload quan trọng, hãy bật fast snapshot restore trên snapshot nguồn.
resource "aws_ebs_volume" "data" {
availability_zone = "us-east-1a"
size = 2000
type = "gp3" # nhanh hơn gp2 với volume dung lượng lớn
throughput = 500
}
Kubernetes Resource
Provider kubernetes và helm sẽ chờ cho đến khi deployment đạt trạng thái sẵn sàng. Nếu pod liên tục bị crash, tăng timeout bao nhiêu cũng vô ích — Terraform chỉ chờ lâu hơn trước khi thất bại. Hãy kiểm tra pod trực tiếp:
kubectl get pods -n my-namespace
kubectl describe pod my-app-xxx -n my-namespace
kubectl logs my-app-xxx -n my-namespace
Hãy sửa vấn đề của pod trước. Timeout trong Terraform không có ý nghĩa gì cho đến khi container hoạt động ổn định.
Bước 5 — Xác Nhận Bản Sửa Lỗi
Sau khi terraform apply hoàn tất, hãy kiểm tra nhanh từ cả hai phía:
# Xác nhận Terraform nhận ra nó đã được tạo
terraform state show aws_db_instance.postgres
# Kiểm tra không còn thay đổi pending nào
terraform plan
# Kết quả mong đợi:
# No changes. Your infrastructure matches the configuration.
Sau đó xác nhận từ phía AWS:
aws rds describe-db-instances \
--db-instance-identifier my-db \
--query 'DBInstances[*].{ID:DBInstanceIdentifier,Status:DBInstanceStatus}'
Tham Khảo Nhanh — Timeout Mặc Định Theo Resource
aws_db_instance— create: 40m, update: 80m, delete: 60maws_eks_cluster— create: 30m, delete: 15maws_elasticache_cluster— create: 40m, delete: 40maws_instance— create: 10m, update: 10m, delete: 20mgoogle_container_cluster— create: 40m, update: 60m, delete: 40mazurerm_kubernetes_cluster— create: 90m, update: 90m, delete: 90m
Không phải resource nào cũng có đủ cả ba key — hãy kiểm tra tài liệu trên Terraform Registry trước khi giả định rằng update hay delete có sẵn cho resource của bạn.
Tài Liệu Tham Khảo
- Tài liệu Terraform: Operation Timeouts
- Tài liệu AWS RDS resource trên Terraform Registry
- Chạy
TF_LOG=DEBUG terraform applyđể theo dõi chính xác thời gian được sử dụng ở đâu trong quá trình provisioning

