Thông Báo Lỗi
Bạn đã viết xong HCL, khởi tạo provider, và chạy lệnh terraform plan. Thay vì thấy danh sách tài nguyên, bạn lại đang nhìn chằm chằm vào lỗi chặn này:
Error: google: could not find default credentials
Lỗi này thường xảy ra vì Google Cloud provider không tìm được danh tính hợp lệ để xác thực các API request của bạn. Đây là rào cản phổ biến, nhưng thông thường bạn có thể khắc phục trong vòng chưa đầy 60 giây.
Nguyên Nhân
Terraform không tự động biết bạn là ai chỉ vì bạn đã đăng nhập vào GCP Console trên trình duyệt. Nó dựa vào một cơ chế đặc biệt gọi là Application Default Credentials (ADC). Dù bạn đã chạy gcloud auth login, Terraform vẫn yêu cầu một bước riêng biệt để truy cập các thông tin xác thực đó cho việc thực thi cục bộ.
Terraform tìm kiếm danh tính của bạn theo thứ tự ưu tiên sau:
- Thuộc tính
credentialsđược định nghĩa trực tiếp trong blockprovider "google"của bạn. - Biến môi trường
GOOGLE_APPLICATION_CREDENTIALStrỏ đến file JSON key. - File ADC cục bộ được tạo bởi Google Cloud CLI.
- Metadata server (chỉ khi bạn đang chạy bên trong một GCE instance hoặc GKE cluster).
Nếu provider kiểm tra cả bốn vị trí mà không tìm thấy gì, nó sẽ ném ra lỗi và dừng lại.
Hướng Dẫn Khắc Phục
Giải pháp 1: Dùng gcloud Application Default Login (Khuyến nghị)
90% trường hợp, đây là cách khắc phục duy nhất bạn cần. Đây là phương pháp an toàn nhất cho công việc cục bộ vì nó dùng danh tính người dùng của bạn mà không cần quản lý hay lưu trữ các service account key tiềm ẩn rủi ro.
Mở terminal và chạy:
gcloud auth application-default login
Một tab trình duyệt sẽ tự động mở ra. Đăng nhập bằng tài khoản Google và nhấn "Allow." Sau khi hoàn tất, CLI sẽ tạo một file JSON nhỏ (khoảng 2.3 KB) tại một trong các vị trí sau:
- Linux/macOS:
~/.config/gcloud/application_default_credentials.json - Windows:
%APPDATA%\gcloud\application_default_credentials.json
Thử chạy lại terraform plan. Lệnh sẽ hoạt động ngay lập tức.
Giải pháp 2: Thiết Lập Biến Môi Trường
Nếu bạn đang làm việc trong CI/CD pipeline hoặc cần mạo danh một Service Account cụ thể, hãy dùng biến môi trường. Cách này chỉ định cho Terraform biết chính xác file JSON key nào cần sử dụng.
- Tải xuống Service Account JSON key từ GCP IAM Console.
- Khai báo đường dẫn trong phiên shell hiện tại của bạn:
Trên macOS/Linux:
export GOOGLE_APPLICATION_CREDENTIALS="/Users/username/keys/my-sa-key.json"
Trên Windows (PowerShell):
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\keys\my-sa-key.json"
Giải pháp 3: Cấu Hình Provider Tường Minh
Bạn có thể hardcode đường dẫn thông tin xác thực trực tiếp vào code. Hãy dùng cách này một cách hạn chế; nó tiềm ẩn rủi ro với các dự án nhóm vì tạo ra sự phụ thuộc vào đường dẫn file cục bộ mà đồng nghiệp của bạn có thể không có.
provider "google" {
project = "production-project-123"
region = "us-central1"
credentials = file("local-auth-key.json")
}
Lưu ý quan trọng: Nếu dùng cách này, hãy thêm *.json vào .gitignore ngay lập tức để tránh lộ secrets lên repository.
Xác Minh: Đã Hoạt Động Chưa?
Để xác nhận Terraform nhận được thông tin xác thực của bạn, hãy chạy một lệnh plan đơn giản. Bạn chưa cần cam kết thay đổi hạ tầng nào cả.
terraform plan
Nếu bạn thấy "No changes. Your infrastructure matches the configuration," tức là bạn đã xác thực thành công. Nếu lỗi vẫn còn, hãy khởi động lại terminal để đảm bảo các biến môi trường mới đã được nạp vào.
Bạn cũng có thể kiểm tra sự tồn tại của file ADC bằng cách chạy:
# macOS/Linux
cat ~/.config/gcloud/application_default_credentials.json | grep "client_id"
Mẹo Hay Khi Xác Thực GCP
Các vấn đề xác thực thường xuất phát từ "environment drift" — khi cài đặt cục bộ của bạn không khớp với yêu cầu của cloud project. Dưới đây là cách giữ mọi thứ gọn gàng:
- Bỏ key tồn tại lâu dài: Dùng
gcloud auth application-default loginthay vì tải xuống JSON key. Rò rỉ thông tin đăng nhập cá nhân khó xảy ra hơn nhiều so với việc để lộ một file tĩnh. - Chú ý Project ID: Đôi khi thông tin xác thực hợp lệ nhưng project lại sai. Hãy chỉ định rõ ràng project mục tiêu bằng
export GOOGLE_CLOUD_PROJECT="your-project-id"để tránh nhầm lẫn. - Tạo chuỗi bảo mật: Khi Terraform code của bạn cần mật khẩu ngẫu nhiên cho SQL user hoặc metadata, hãy dùng công cụ như Password Generator trên ToolCraft. Công cụ này tạo chuỗi entropy cao ngay trên máy bạn, giữ secrets không bị lộ lên internet công cộng.
- Kiểm tra Permissions: Nếu lỗi chuyển thành "403 Forbidden," có nghĩa là thông tin xác thực đã được tìm thấy nhưng tài khoản của bạn thiếu role
Service Usage Consumer. Role này bắt buộc phải có để thực hiện hầu hết các API call trong một GCP project.

