Sửa lỗi "Resource provisioning timed out" trong Terraform

intermediate🏗️ Terraform2026-03-21| Terraform 0.12+, AWS/GCP/Azure, Linux/macOS/Windows

Error Message

Error: A resource could not be created during the last apply. The resource provisioning timed out.
#terraform#timeout#resource#apply#provisioning

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 kuberneteshelm 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: 60m
  • aws_eks_cluster — create: 30m, delete: 15m
  • aws_elasticache_cluster — create: 40m, delete: 40m
  • aws_instance — create: 10m, update: 10m, delete: 20m
  • google_container_cluster — create: 40m, update: 60m, delete: 40m
  • azurerm_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

Related Error Notes