Terraform修改Org Policy时无法识别正确项目的解决求助
问题
我在本地终端用Terraform给特定项目配置禁用「Disable Service Account Key Creation」策略,阻止它继承父组织的策略,代码如下:
# Disable the Disable Service Account Key Creation policy for the project resource "google_org_policy_policy" "disableServiceAccountKeyCreation" { name = "projects/${var.project_id}/policies/iam.disableServiceAccountKeyCreation" parent = "projects/${var.project_id}" spec { inherit_from_parent = false rules { enforce = "FALSE" } } }
但一直碰到下面的错误:
Error: Error creating Policy: failed to create a diff: failed to retrieve Policy resource: googleapi: Error 403: Your application is authenticating by using local Application Default Credentials. The orgpolicy.googleapis.com API requires a quota project, which is not set by default. To learn how to set your quota project, see https://cloud.google.com/docs/authentication/adc-troubleshooting/user-creds . │ Details: │ [ │ { │ "@type": "type.googleapis.com/google.rpc.ErrorInfo", │ "domain": "googleapis.com", │ "metadata": { │ "consumer": "projects/7640********", │ "service": "orgpolicy.googleapis.com" │ }, │ "reason": "SERVICE_DISABLED" │ } │ ]
我已经做了这些操作:
- 用
gcloud auth application-default login完成认证 - 已设置配额项目(确认配置正确)
- 目标项目已经启用
Org Policy API
注意到错误里的projects/7640********项目编号和我的项目编号不符,这个编号来自application_default_credentials.json里client_id的前几位。想问怎么解决?这是不是bug?之前有谷歌人员在GitHub提过相同问题但没得到回复。
解决方案
1. 重置应用默认凭据并指定配额项目
执行以下命令,重新生成凭据并明确绑定你的目标项目作为配额项目:
gcloud auth application-default login --quota-project=YOUR_TARGET_PROJECT_ID
替换YOUR_TARGET_PROJECT_ID为你实际的项目ID,这会覆盖旧的application_default_credentials.json,确保配额项目指向正确的项目。
2. 手动修改凭据文件
如果上述命令无效,找到本地的application_default_credentials.json文件(通常在~/.config/gcloud/目录下),添加或修改quota_project_id字段,设置为你的目标项目ID:
{ ... "quota_project_id": "YOUR_TARGET_PROJECT_ID", ... }
保存后重新运行Terraform命令。
3. 直接在Terraform配置中指定凭据和配额项目
在Terraform的Google Provider配置里,明确指定凭据路径和配额项目,避免依赖默认ADC:
provider "google" { project = var.project_id credentials = file("path/to/your/service-account-key.json") quota_project = var.project_id }
推荐使用服务账号密钥而非用户凭据,因为用户ADC容易出现这类配额项目不匹配的问题,服务账号的权限也更可控。
4. 检查目标项目的API启用状态
再次确认目标项目中Org Policy API确实已启用,同时检查错误信息里的那个陌生项目编号(7640开头的),如果是谷歌的默认项目,可能是你的凭据关联了不必要的项目,通过重置凭据可以解除关联。
内容的提问来源于stack exchange,提问作者jado06

