首页 > 解决方案 > 需要权限 iam.serviceAccounts.setIamPolicy 才能对服务帐户执行此操作

问题描述

我有以下 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,第二个脚本出现此错误

错误:为服务帐户“projects/pcb-poc-pci/serviceAccounts/pci-api@pcb-poc-pci.iam.gserviceaccount.com”应用 IAM 策略时出错:为服务帐户“projects/pcb-poc”设置 IAM 策略时出错-pci/serviceAccounts/pci-api@pcb-poc-pci.iam.gserviceaccount.com': googleapi: 错误 403: 需要权限 iam.serviceAccounts.setIamPolicy 才能对服务帐户项目/pcb-poc-pci/ 执行此操作serviceAccounts/pci-api@pcb-poc-pci.iam.gserviceaccount.com.,禁止

这些是该服务帐户的角色 在此处输入图像描述

根据此处的谷歌文档和错误消息,服务帐户管理员应该足够了,我的服务帐户已经拥有

在此处输入图像描述

不知道我错过了什么

标签: terraformterraform-provider-gcp

解决方案


解决方案 1

尽管我使用了命令,但似乎命令行没有选择正确的凭据/服务帐户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 管道和其他开发人员中设置地形变量的问题较少


推荐阅读