Terraform 对服务帐户执行此操作需要iam.serviceAccounts.setIamPolicy权限

Terraform 对服务帐户执行此操作需要iam.serviceAccounts.setIamPolicy权限,terraform,terraform-provider-gcp,Terraform,Terraform Provider Gcp,我有下面的terraform脚本,用于创建一个新的服务帐户并使其成为所有者。 脚本创建服务帐户,但在分配角色时会引发错误 resource "google_service_account" "pci_api_service_account" { account_id = "pci-api" display_name = "Api" project = var.project_id } re

我有下面的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
  ]
}

我已经通过运行

gcloud auth activate-service-account --project=pcb-poc-pci --key-file ~/sa/pcb-poc-pci-test-sa-94aa6c81d650.json
当我运行
terragrunt apply
时,第二个脚本会出现此错误

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

这些是该服务帐户的角色

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

不确定我错过了什么解决方案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管道和其他开发人员设置地形变量的问题较少,因此首选此方法。

命令
gcloud auth activate service account
为CLI(gcloud)设置凭据。该命令不会为应用程序、API等设置凭据。您的回答是正确的,我更喜欢您的方法。另一个推荐的方法是将环境变量设置为指向服务帐户JSON文件:
set GOOGLE\u APPLICATION\u CREDENTIALS=fullpath.JSON
,以解决问题,您之前设置了环境变量
GOOGLE\u APPLICATION\u CREDENTIALS
,或者执行了命令
gcloud auth APPLICATION default login
。检查CLI和环境设置的方式,以便将来不会遇到问题。这两种方法都设置ADC(应用程序默认登录)。如果您没有在Terraform代码中指定服务帐户,Terraform将使用ADC查找凭据。@JohnHanley是的,您是对的,我用
GOOGLE\u应用程序\u凭据
进行了检查,并且正在工作。在我之前的评论中,我指的是“应用程序默认凭据”,而不是“应用程序默认登录”。