Lỗi Xảy Ra
Error: Provider configuration not present
To work with module.networking.aws_vpc.main its original provider
configuration at module.networking.provider["registry.terraform.io/hashicorp/aws"].eu_west
must be available in the state, but is no longer present.
Đây là lỗi không khớp trạng thái. Terraform tìm thấy các tài nguyên trong terraform.tfstate được tạo ra với một provider alias — nhưng alias đó đã biến mất khỏi cấu hình hiện tại của bạn. Không có nó, Terraform không thể plan, apply hay destroy những tài nguyên đó. Hạ tầng AWS thực tế có thể hoàn toàn bình thường. Terraform chỉ đơn giản là bị mất tay cầm để quản lý chúng.
Nguyên Nhân Gây Ra Lỗi
Mỗi tài nguyên trong terraform.tfstate đều mang một dấu vân tay provider. Khi dùng provider alias bên trong một module, alias đó được gắn vào định danh của tài nguyên. Đổi tên, xóa đi, hoặc quên truyền vào — Terraform sẽ mất đi cái tay cầm cần thiết để quản lý những tài nguyên đó.
Các nguyên nhân phổ biến nhất:
- Bạn đã xóa hoặc comment out khối
providerstrong lời gọi module - Bạn đổi tên provider alias (ví dụ:
aws.secondary→aws.eu) - Bạn xóa một khối
providertrong root module - Bạn xóa toàn bộ khối module mà chưa destroy các tài nguyên bên trong trước
- Đồng nghiệp refactor providers map nhưng không cập nhật tất cả các lời gọi module
Nguyên Nhân Gốc Rễ: Cách Provider Alias Hoạt Động Trong Module
Đây là pattern multi-region điển hình thường gây ra lỗi này:
# root/main.tf — hai cấu hình AWS provider
provider "aws" {
region = "us-east-1"
}
provider "aws" {
alias = "eu_west" # tên alias rất quan trọng
region = "eu-west-1"
}
# Lời gọi module — truyền provider có alias một cách tường minh
module "networking" {
source = "./modules/networking"
providers = {
aws = aws.eu_west
}
}
Bên trong child module, các tài nguyên sử dụng provider có alias này:
# modules/networking/main.tf
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
Terraform ghi lại tài nguyên đó trong state là được gắn với module.networking.provider["registry.terraform.io/hashicorp/aws"].eu_west. Xóa providers map hoặc đổi tên eu_west, và Terraform không thể định vị cấu hình gốc đó nữa — từ đó gây ra lỗi.
Cách Sửa 1: Khôi Phục Provider Alias Trong Lời Gọi Module
Chín phần mười trường hợp, ai đó đã vô tình xóa hoặc thay đổi khối providers. Khôi phục nó về đúng như khi các tài nguyên được tạo lần đầu sẽ sửa lỗi ngay lập tức.
# Bước 1: Kiểm tra alias mà state đang mong đợi
terraform state show module.networking.aws_vpc.main
Tìm trường provider trong output. Nó hiển thị đường dẫn alias chính xác mà Terraform mong đợi:
provider = "provider[\"registry.terraform.io/hashicorp/aws\"].eu_west"
# Bước 2: Đảm bảo root module của bạn có alias tương ứng
provider "aws" {
alias = "eu_west" # Phải khớp chính xác với tên trong state
region = "eu-west-1"
}
# Bước 3: Truyền vào trong lời gọi module
module "networking" {
source = "./modules/networking"
providers = {
aws = aws.eu_west
}
}
Thêm một bước để củng cố — khai báo configuration_aliases trong child module. Điều này biến việc thiếu providers map thành lỗi lúc plan thay vì một cái bẫy âm thầm:
# modules/networking/versions.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
configuration_aliases = [aws]
}
}
}
# Bước 4: Xác nhận bản sửa
terraform plan
Không còn lỗi provider và plan chỉ hiển thị các thay đổi như mong đợi? Bạn đã xong.
Cách Sửa 2: Khi Bạn Cần Đổi Tên Alias
Đổi tên alias không phải là thay đổi bề ngoài — Terraform coi đó là một provider hoàn toàn khác. Các tài nguyên trong state vẫn trỏ đến tên cũ, vì vậy bạn không thể chỉ đơn giản thay aws.eu_west bằng aws.eu rồi tiếp tục.
Phương án A — Destroy tài nguyên với alias cũ, rồi tạo lại với alias mới:
# 1. Tạm thời khôi phục alias về tên cũ
provider "aws" {
alias = "eu_west" # Tên cũ
region = "eu-west-1"
}
module "networking" {
source = "./modules/networking"
providers = { aws = aws.eu_west }
}
# 2. Destroy các tài nguyên một cách sạch sẽ
terraform destroy -target=module.networking
# 3. Bây giờ đổi tên alias và cập nhật lời gọi module
provider "aws" {
alias = "eu" # Tên mới
region = "eu-west-1"
}
module "networking" {
source = "./modules/networking"
providers = { aws = aws.eu }
}
# 4. Tạo lại
terraform apply
Phương án B — Xóa khỏi state và reimport (cho các tài nguyên production không thể tạo lại):
# 1. Xóa tài nguyên khỏi Terraform state
# (KHÔNG xóa tài nguyên thực trên cloud)
terraform state rm module.networking.aws_vpc.main
# 2. Đổi tên alias trong các file .tf của bạn
# 3. Import tài nguyên hiện có dưới đường dẫn provider mới
terraform import module.networking.aws_vpc.main vpc-0abc123def456789ab
Chạy terraform state list trước để lấy danh sách đầy đủ các tài nguyên gắn với alias cũ. Sau đó lặp lại chu trình state rm + import cho từng tài nguyên một.
Cách Sửa 3: Khi Bạn Muốn Xóa Hoàn Toàn Module
Xóa khối module mà chưa destroy các tài nguyên bên trong trước chính là cách điển hình để rơi vào lỗi này. Terraform cần cấu hình provider để lên kế hoạch cho thao tác destroy. Xóa khối đi, và bạn đã lấy mất công cụ đó của nó.
# Cách sai — dẫn thẳng đến lỗi 'Provider configuration not present':
# 1. Xóa khối module
# 2. Chạy terraform apply ← lỗi xảy ra ở đây
# Cách đúng:
# 1. Giữ nguyên khối module
terraform destroy -target=module.networking
# 2. CHỈ SAU KHI destroy thành công, hãy xóa khối module khỏi file .tf
# 3. Chạy apply (kết quả sẽ là no-op)
terraform apply
Các Bước Xác Nhận
Trước khi kết luận đã xong, hãy chạy ba kiểm tra sau:
# 1. Plan phải chạy mà không có lỗi provider
terraform plan
# 2. Kiểm tra tài nguyên vẫn còn trong state
terraform state list | grep module.networking
# 3. Xác nhận đường dẫn provider trong state khớp với alias của bạn
terraform state show module.networking.aws_vpc.main | grep provider
Lệnh cuối cùng sẽ cho output tương tự như:
provider = "provider[\"registry.terraform.io/hashicorp/aws\"].eu_west"
Tên alias đó phải khớp với những gì bạn có trong khối provider ở root module. Nếu không khớp, bạn chưa xong đâu.
Phòng Tránh
- Destroy trước khi xóa: Luôn chạy
terraform destroy -target=module.xxxtrước khi xóa khối module hoặc bỏ một alias. Xóa config và chạy apply trong một bước sẽ gây ra sự cố. - Khai báo
configuration_aliasestrong child module: Buộc các caller phải truyền providers map một cách tường minh. Thiếu map sẽ trở thành lỗi lúc plan, không phải bất ngờ lúc runtime. - Coi việc đổi tên alias là thay đổi breaking: Cập nhật mọi lời gọi module sử dụng alias đó trong cùng một commit. Kiểm tra việc đổi tên trong workspace non-production trước khi chạm vào môi trường chính.
- Kiểm tra state trước các refactor lớn: Chạy
terraform state listtrước khi tái cấu trúc module — nó hiển thị chính xác tài nguyên nào đang gắn với alias nào, để không có gì bị bỏ lại. - Tách state file theo region: Với các thiết lập multi-region phức tạp, một Terraform root module cho mỗi region sẽ gần như loại bỏ hoàn toàn việc quản lý alias. Nhiều file hơn, ít đau đầu về alias hơn.
Bạn đang làm việc với cấu hình dạng YAML cùng với Terraform — như terragrunt.hcl hoặc các file biến đầu vào? Công cụ YAML ↔ JSON Converter của ToolCraft giúp phát hiện lỗi thụt lề và định dạng trước khi terraform init báo lỗi.

