我正在尝试使用GCP云存储设置一个地形远程后端。我首先从CLI创建了一个服务帐户:
gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME --display-name $SERVICE_ACCOUNT_NAME
然后添加角色。从我在云存储(GCS)文档中读到的,roles/storage.objectAdmin
角色应该赋予GCS对象的全部权限:
gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com --role roles/storage.objectAdmin
我有以下main.tf
文件:
terraform {
required_version = "1.2.2"
required_providers {
google = {
source = "hashicorp/google"
version = "4.13.0"
}
}
backend "gcs" {
}
}
provider "google" {
project = "project-sandbox"
region = "europe-west1"
impersonate_service_account = "my-test-svc@project-sandbox.iam.gserviceaccount.com"
}
下面是我的remote.backend
文件:
bucket = "my_example_sandbox_bucket_985gd5d"
prefix = "terraform/state"
impersonate_service_account = "my-test-svc@project-sandbox.iam.gserviceaccount.com"
然而,当我运行terraform init -backend-config=remote.backend
时,我得到以下错误:
Initializing the backend...
╷
│ Error: Failed to get existing workspaces: querying Cloud Storage failed: Get "https://storage.googleapis.com/storage/v1/b/my_example_sandbox_bucket_985gd5d/o?alt=json&delimiter=%2F&pageToken=&prefix=terraform%2Fstate%2F&prettyPrint=false&projection=full&versions=false": impersonate: status code 403: {
│ "error": {
│ "code": 403,
│ "message": "The caller does not have permission",
│ "status": "PERMISSION_DENIED"
│ }
│ }
我试图给我的服务帐户更多的角色,如roles/iam.serviceAccountTokenCreator
作为使用GCS作为后端状态的Terraform文档,这是必需的。然而,错误仍然存在。我的地形有问题吗?还是我错过了什么角色?我可以试着给它所有者的角色,但这似乎有点极端,因为它应该只需要写文件到桶。
请检查以下内容:
- 需要启用组织策略API
- 服务帐户需要具有组织级别的
Organization Policy Administrator
角色。 - 服务帐户用户和服务帐户令牌创建者角色应该分配给主体帐户以模拟服务帐户。
- 您的
ADC
(应用程序默认凭证)需要配置为与您的terraform apply
用户/组织相同的用户。如果没有,您可以再次运行gcloud auth application-default login
并使用正确的用户重新创建ADC。