terraform - 需要权限 iam.serviceAccounts.setIamPolicy 才能对服务帐户执行此操作

标签 terraform terraform-provider-gcp

我有下面的 terraform 脚本,用于创建一个新的服务帐户并使其成为所有者。 脚本创建服务帐户,但会在分配角色时抛出错误

resource "google_service_account" "pci_api_service_account" {
  account_id   = "pci-api"
  display_name = "Api"
  project      = var.project_id
}

resource "google_service_account_iam_member" "pci_api_owner_binding" {
  # service_account_id = "projects/pcb-poc-pci/serviceAccounts/infra-admin-sa@pcb-poc-pci.iam.gserviceaccount.com"
  service_account_id = google_service_account.pci_api_service_account.name
  role   = "roles/owner"
  member = "serviceAccount:${google_service_account.pci_api_service_account.email}"
  depends_on = [
    google_service_account.pci_api_service_account
  ]
}

并且我已经通过运行 infra-admin-sa 服务帐户进行了身份验证

gcloud auth activate-service-account --project=pcb-poc-pci --key-file ~/sa/pcb-poc-pci-test-sa-94aa6c81d650.json

当我运行 terragrunt apply 时,第二个脚本出现此错误

Error: Error applying IAM policy for service account 'projects/pcb-poc-pci/serviceAccounts/pci-api@pcb-poc-pci.iam.gserviceaccount.com': Error setting IAM policy for service account 'projects/pcb-poc-pci/serviceAccounts/pci-api@pcb-poc-pci.iam.gserviceaccount.com': googleapi: Error 403: Permission iam.serviceAccounts.setIamPolicy is required to perform this operation on service account projects/pcb-poc-pci/serviceAccounts/pci-api@pcb-poc-pci.iam.gserviceaccount.com., forbidden

这些是该服务帐户的角色 enter image description here

基于谷歌文档 here和错误消息,服务帐户管理员应该足够了,我的服务帐户已经有了

enter image description here

不确定我错过了什么

最佳答案

方案一

尽管我使用了 gcloud auth activate-service-account 命令,但命令行似乎没有选择正确的凭证/服务帐户。

所以我把这个添加到我的脚本中

provider "google" {
  credentials = file(var.service_account_file_path)
  project     = var.project_id
}

现在一切正常

解决方案2

根据@John Hansley 下面的评论

export GOOGLE_APPLICATION_CREDENTIALS=fullpath.json

然后 terraform 将选择该服务帐户文件,脚本将成功运行。

此方法是首选,因为在 CICD 管道和其他开发人员中设置地形变量的问题较少

关于terraform - 需要权限 iam.serviceAccounts.setIamPolicy 才能对服务帐户执行此操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66483002/

相关文章:

google-cloud-platform - 如何使用 Terraform 获取默认的 GCP 项目和区域?

google-cloud-platform - 如何获取 GKE 集群哈希值以更新 GCP 防火墙规则

terraform - 如何有条件地填充 terraform 中的参数值?

amazon-web-services - Terraform_Remote_State 错误 : This object has no argument, 嵌套 block ,或名为 "vpc_id"的导出属性

terraform - 如何使用 terraform 0.13.5 检查列表中是否存在该值?

azure - 使用 terraform 禁用允许公共(public) blob 访问

terraform - 通过 Terraform 在 GCP 上启用电子邮件/密码身份提供商

azure - AKS - Terraform 的 network_profile block

terraform - 从地形 map 变量中提取值

input - 将 GitHub Actions 工作流中的输入值绕过到 terraform 变量文件