需要 iam.serviceAccounts.setIamPolicy 权限才能对服务帐户执行此操作
Permission iam.serviceAccounts.setIamPolicy is required to perform this operation on service account
我有下面的 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
]
}
并且我已经通过 运行ning
使用 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
这些是该服务帐户的角色
根据 google 文档 here 和错误消息,服务帐户管理员应该足够了,我的服务帐户已经有了
不确定我错过了什么
解决方案 1
似乎命令行没有选择正确的 credential/service 帐户,尽管我使用了 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 变量的问题较少
我有下面的 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
]
}
并且我已经通过 运行ning
使用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
这些是该服务帐户的角色
根据 google 文档 here 和错误消息,服务帐户管理员应该足够了,我的服务帐户已经有了
不确定我错过了什么
解决方案 1
似乎命令行没有选择正确的 credential/service 帐户,尽管我使用了 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 变量的问题较少