Sửa lỗi Terraform 'No configuration files' Khi Chạy Lệnh Ngoài Thư Mục .tf

beginner🏗️ Terraform2026-04-20| Terraform 0.13+, Linux/macOS/Windows, mọi cloud provider (AWS, GCP, Azure)

Error Message

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#cấu hình#thư mục#hcl

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ặc environments/prod/
  • Bạn đã clone vào một thư mục con nhưng chưa cd và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 .tf mà 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-version vào mỗi thư mục root module. Các công cụ như tfenv dù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 .tfvars trướ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 -chdir thay vì cd thuần trong CI pipeline. Một lệnh cd thất bại âm thầm sẽ để pipeline tiếp tục chạy ở sai vị trí. -chdir thấ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.

Related Error Notes