如何解决Terraform在GCP中为服务账号分配角色时出现的googleapi: Error 403: The caller does not have permission, forbidden错误
先梳理下你的场景和提供的关键信息:
你的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时,需要两个关键权限:
resourcemanager.projects.getIamPolicy(读取当前项目IAM政策)resourcemanager.projects.setIamPolicy(修改并设置新的项目IAM政策)
这两个权限不在你当前给Cloud Build账号绑定的角色范围内。
解决方案
你可以通过两种方式修复:
方式1:绑定预定义角色(快速解决)
给你的Cloud Build服务账号(格式一般是[你的项目编号]@cloudbuild.gserviceaccount.com)添加roles/resourcemanager.projectIamAdmin角色,这个预定义角色包含了修改项目IAM政策的所有必要权限。
方式2:创建最小权限的自定义角色(推荐)
如果不想给过大的权限,可以创建一个自定义角色,仅包含以下两个权限:
resourcemanager.projects.getIamPolicyresourcemanager.projects.setIamPolicy
然后将这个自定义角色绑定到Cloud Build服务账号上,遵循最小权限原则。
验证步骤
添加权限后,重新触发Cloud Build构建,应该就能成功执行Terraform的IAM绑定操作了。你也可以先在本地用拥有项目IAM权限的账号测试Terraform代码,确认代码本身没问题,再回到Cloud Build验证权限修复后的效果。
内容的提问来源于stack exchange,提问作者Pritish




