Chuyện Gì Vừa Xảy Ra
Bạn chạy terraform apply (hoặc plan, init) và nhận được thông báo này:
Error: No configuration files
Apply requires configuration to be present. Applying without a configuration would mark everything for destruction, which is normally not what is wanted. If you still want to proceed, -destroy flag can be used to destroy resources without a configuration.
Terraform đã quét thư mục hiện tại và không tìm thấy file .tf nào. Không có file, không có cấu hình, không có gì cả.
Lỗi này thường xuất hiện vào đúng lúc tệ nhất — giữa chừng deploy, có việc gấp, và bạn đã chạy lệnh từ sai thư mục suốt từ đầu. Hoặc bạn clone một repo và cấu trúc thư mục không như kỳ vọng. Dù sao thì cách sửa thường chỉ cần một lệnh cd là xong.
Quy Trình Debug
Bước 1: Kiểm tra bạn đang ở đâu
pwd
ls -la
Xem output có file .tf nào không. Không thấy? Đó là nguyên nhân rồi. Terraform yêu cầu ít nhất một file .tf trong thư mục hiện tại — dù chỉ là một file main.tf trống — để coi đó là root cấu hình hợp lệ.
Bước 2: Tìm nơi các file .tf thực sự nằm
find . -name "*.tf" -type f 2>/dev/null
Lệnh này tìm kiếm toàn bộ cây thư mục từ vị trí hiện tại. Một số tình huống phổ biến:
- Bạn đang ở root của repo, nhưng cấu hình nằm trong
terraform/,infra/, hoặcenvironments/prod/ - Bạn đã clone vào một thư mục con nhưng chưa
cdvào bên trong - Thư mục chỉ có file
.tf.json— Terraform cũng hỗ trợ định dạng JSON nên chúng vẫn hợp lệ - Ai đó đã đổi tên hoặc xóa các file
.tfmà không thông báo
Bước 3: Kiểm tra xem bạn có đang ở nhầm trong thư mục module con không
Giả sử repo của bạn trông như thế này:
infra/
├── main.tf
├── variables.tf
├── outputs.tf
└── modules/
└── networking/
├── main.tf
└── variables.tf
Chạy terraform apply từ bên trong infra/modules/networking/ sẽ không hoạt động đúng. Các module không độc lập — chúng được thiết kế để được gọi từ root module, không phải để apply trực tiếp.
Cách Sửa
Cách sửa 1: Điều hướng đến đúng thư mục
Chín trên mười lần, chỉ cần làm vậy là đủ:
cd /path/to/your/terraform/root
terraform init
terraform plan
terraform apply
Trước khi chạy bất cứ thứ gì, hãy xác nhận bạn đang ở đúng chỗ:
ls *.tf
Bạn sẽ thấy output tương tự như:
main.tf outputs.tf providers.tf variables.tf
Cách sửa 2: Dùng flag -chdir (Terraform 0.14+)
Cần chạy Terraform từ một vị trí cố định — chẳng hạn, script CI luôn bắt đầu từ root repo? Dùng -chdir:
terraform -chdir=./terraform/environments/prod apply
Terraform sẽ chuyển vào thư mục đó trước khi làm bất cứ việc gì. Cách này tương đương với cd + lệnh nhưng gộp trong một lần gọi duy nhất. An toàn hơn nhiều trong script và pipeline khi thư mục làm việc không được đảm bảo.
Cách sửa 3: Tạo main.tf tối giản nếu bạn đang khởi tạo mới
Bắt đầu từ đầu chưa có cấu hình nào? Tạo một entry point tối giản:
touch main.tf
Hoặc thêm block terraform để ghim phiên bản yêu cầu:
cat > main.tf <<'EOF'
terraform {
required_version = ">= 1.0"
}
EOF
Sau đó chạy terraform init. Một file main.tf trống hoặc gần trống là đủ để vượt qua kiểm tra. Terraform chỉ cần có gì đó để làm việc.
Cách sửa 4: Nếu bạn thực sự muốn xóa tài nguyên
Thông báo lỗi có gợi ý về trường hợp này. Để xóa tất cả mọi thứ trong state khi không có file cấu hình, chạy:
terraform apply -destroy
Hoặc dùng lệnh cổ điển:
terraform destroy
Hãy dừng lại và suy nghĩ trước khi nhấn Enter. Nếu state file của bạn tham chiếu đến tài nguyên production, lệnh này sẽ đánh dấu tất cả chúng để xóa — mà không có cấu hình nào để kiểm soát phạm vi xóa.
Xác Nhận Đã Sửa Xong
Khi bạn đã ở đúng thư mục (hoặc dùng -chdir), yêu cầu Terraform validate cấu hình:
terraform validate
Output mong đợi:
Success! The configuration is valid.
Chưa chạy init trong thư mục này? Hãy làm trước:
terraform init
terraform validate
terraform plan
Một lần plan thành công — dù không có thay đổi nào — xác nhận Terraform đã tìm thấy cấu hình của bạn và có thể đọc được.
Các Cấu Trúc Repo Thường Gây Ra Lỗi Này
Các team tổ chức Terraform repo theo nhiều cách rất khác nhau. Ba mô hình này hay làm người dùng nhầm lẫn nhất:
# Mô hình 1: phân chia theo môi trường
infra/
└── environments/
├── dev/
│ └── main.tf ← chạy từ đây
├── staging/
│ └── main.tf
└── prod/
└── main.tf
# Mô hình 2: phân chia theo thành phần
terraform/
├── networking/
│ └── main.tf ← chạy từ đây
├── compute/
│ └── main.tf
└── databases/
└── main.tf
# Mô hình 3: phẳng (dự án nhỏ)
./
├── main.tf ← chạy từ root repo
├── variables.tf
└── outputs.tf
Trước khi chạy bất kỳ lệnh Terraform nào trong một repo chưa quen, hãy xem README hoặc Makefile để biết thư mục làm việc dự kiến. Mất 30 giây kiểm tra sẽ tiết kiệm rất nhiều thời gian đau đầu.
Phòng Tránh
Một số thói quen giúp tránh lỗi này tái diễn:
- Bọc các lệnh trong Makefile hoặc shell script với đường dẫn thư mục được hardcode. Lỗi do con người biến mất hoàn toàn trong CI/CD khi đường dẫn đã được cố định.
- Thêm file
.terraform-versionvào mỗi thư mục root module. Các công cụ nhưtfenvdùng nó để ghim phiên bản, đồng thời nó cũng đóng vai trò như dấu hiệu trực quan: "đây là Terraform root, apply từ đây." - Validate các block YAML trong
.tfvarstrước khi chạy — đôi khi file biến bị hỏng hoặc có lỗi cú pháp gây ra hành vi không mong muốn. Công cụ YAML ↔ JSON Converter tại toolcraft.app/en/tools/developer/yaml-json-converter chạy ngay trên trình duyệt không cần upload, nên an toàn cho các đoạn cấu hình nội bộ. - Ưu tiên dùng
-chdirthay vìcdthuần trong CI pipeline. Một lệnhcdthất bại âm thầm sẽ để pipeline tiếp tục chạy ở sai vị trí.-chdirthất bại một cách rõ ràng.
Bài Học Rút Ra
Lỗi này cảm giác ngượng — chỉ là "nhầm thư mục thôi." Nhưng ngay cả các kỹ sư kỳ cựu cũng dính phải, đặc biệt trong các repo với 20+ Terraform module trải rộng qua môi trường dev, staging và prod. Tình huống tệ nhất là lúc 2 giờ sáng: bạn đang SSH vào bastion host, chạy Terraform thủ công để xử lý sự cố khẩn cấp, và bạn lệch đúng một cấp thư mục.
Flag -chdir ra đời trong phiên bản 0.14 chính vì đây là nỗi đau tái diễn quá thường xuyên. Nếu một script có thể chạy từ thư mục làm việc không xác định, hãy dùng nó.
Một lưu ý cuối: nếu terraform plan chạy được nhưng hiển thị tài nguyên không mong đợi, có thể bạn đang ở đúng loại thư mục nhưng sai môi trường. Kiểm tra kỹ xem bạn đang nhắm vào prod/ chứ không phải staging/ trước khi apply.

