Sửa lỗi 'google: could not find default credentials' trong Terraform

beginner🏗️ Terraform2026-07-17| Môi trường phát triển cục bộ (macOS, Linux, Windows), Terraform v1.0+, Google Cloud Provider

Error Message

google: could not find default credentials
#terraform#gcp#google-cloud#xác thực#devops#iac

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 block provider "google" của bạn.
  • Biến môi trường GOOGLE_APPLICATION_CREDENTIALS trỏ đế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 login thay 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.

Related Error Notes