Terraform:为新建Cloud Build触发器服务账号分配角色遇权限问题
问题场景
使用Terraform创建Google Cloud Build触发器后,部署步骤因缺少roles/cloudfunctions.developer权限失败。尝试通过google_project_iam_member资源为触发器关联的服务账号添加权限时,直接引用触发器的service_account属性,触发如下错误:
╷
│ Error: invalid value for member (IAM members must have one of the values outlined here: https://cloud.google.com/billing/docs/reference/rest/v1/Policy#Binding)
│
│ with module.pipedrive.google_project_iam_member.cloudfunctions-developer,
│ on modules/pipedrive/main.tf line 66, in resource "google_project_iam_member" "cloudfunctions-developer":
│ 66: member = google_cloudbuild_trigger.build-trigger.service_account
报错原因
google_cloudbuild_trigger资源的service_account属性返回的是纯服务账号邮箱格式(例如PROJECT_ID@cloudbuild.gserviceaccount.com),而Google IAM的member字段要求必须遵循类型:标识符的格式(如serviceAccount:xxx@xxx.com),直接引用属性值不符合格式要求,导致报错。
解决方案
在配置member字段时,手动拼接serviceAccount:前缀,正确的Terraform配置如下:
resource "google_project_iam_member" "cloudfunctions-developer" { project = var.google_project role = "roles/cloudfunctions.developer" # 拼接serviceAccount:前缀和触发器的服务账号属性 member = "serviceAccount:${google_cloudbuild_trigger.build-trigger.service_account}" }
额外注意事项
- 确保触发器资源的名称与配置中的一致(示例中的
build-trigger需替换为你实际定义的google_cloudbuild_trigger资源名称)。 - 这种写法的优势是:如果后续为Cloud Build触发器指定了自定义服务账号,配置会自动适配,无需手动修改服务账号邮箱,保持配置的健壮性。
内容的提问来源于stack exchange,提问作者runixo

