You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Terraform在GCP中为服务账号分配角色时出现的googleapi: Error 403: The caller does not have permission, forbidden错误

解决Terraform在GCP中通过Cloud Build给服务账号分配角色的403权限问题

先梳理下你的场景和提供的关键信息:

你的Terraform代码

sa.tf

resource "google_service_account" "mojo-terra" {
  account_id = "mojo-terra"
  description = "Service account used for terraform script"
}
resource "google_project_iam_member" "mojo-roles" {
  count = length(var.rolesList)
  role = var.rolesList[count.index]
  member = "serviceAccount:${google_service_account.mojo-terra.email}"
}

dev.tfvars

rolesList = [ "roles/iam.serviceAccountUser" ]

错误日志

Step #2: Error: Error when reading or editing Resource "project "poc-dev"" with IAM Policy: Error retrieving IAM policy for project "poc-dev": googleapi: Error 403: The caller does not have permission, forbidden
Step #2:
Step #2: Error: Error when reading or editing Resource "project "poc-dev"" with IAM Member: Role "roles/iam.serviceAccountUser" Member "serviceAccount:asadsfs@poc-dev-1221.iam.gserviceaccount.com": Error retrieving IAM policy for project "poc-dev": googleapi: Error 403: The caller does not have permission, forbidden

当前Cloud Build服务账号绑定的角色

  • 自定义角色cloudbuild
  • Cloud Build Service Account
  • Service Account Admin
  • Create Service Accounts
  • Delete Service Accounts
  • Service Account User
  • Storage Admin

问题根源分析

你碰到的403错误核心原因是:Cloud Build服务账号缺少修改项目IAM策略的权限。你当前配置的角色里,Service Account Admin等只是针对服务账号本身的管理权限(比如创建、删除SA),但google_project_iam_member操作的是项目级别的IAM政策——这个动作需要读取和修改项目IAM规则的权限,而你的Cloud Build账号目前没有这些权限。

具体来说,Terraform执行google_project_iam_member时,需要两个关键权限:

  1. resourcemanager.projects.getIamPolicy(读取当前项目IAM政策)
  2. resourcemanager.projects.setIamPolicy(修改并设置新的项目IAM政策)

这两个权限不在你当前给Cloud Build账号绑定的角色范围内。

解决方案

你可以通过两种方式修复:

方式1:绑定预定义角色(快速解决)

给你的Cloud Build服务账号(格式一般是[你的项目编号]@cloudbuild.gserviceaccount.com)添加roles/resourcemanager.projectIamAdmin角色,这个预定义角色包含了修改项目IAM政策的所有必要权限。

方式2:创建最小权限的自定义角色(推荐)

如果不想给过大的权限,可以创建一个自定义角色,仅包含以下两个权限:

  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.setIamPolicy

然后将这个自定义角色绑定到Cloud Build服务账号上,遵循最小权限原则。

验证步骤

添加权限后,重新触发Cloud Build构建,应该就能成功执行Terraform的IAM绑定操作了。你也可以先在本地用拥有项目IAM权限的账号测试Terraform代码,确认代码本身没问题,再回到Cloud Build验证权限修复后的效果。

内容的提问来源于stack exchange,提问作者Pritish

火山引擎 最新活动