【问题标题】:IAM Permission Issue When Building a Cloud Run Container构建 Cloud Run 容器时的 IAM 权限问题
【发布时间】:2021-10-05 14:13:26
【问题描述】:

我目前正在尝试将开发项目复制到生产项目中。所有代码和文件都已传输,但 Cloud Run 功能尚未构建。

我将提供有关这两个项目架构的更多信息,以防万一。在开发项目中,我们有一个暂存分支。推送到此分支的任何更改都会触发 Cloud Build 触发器,这些触发器会对传入的更改进行完整性检查并部署更新的代码。然后我们可以将这些更改与主分支合并并推送,这会触发额外的 Cloud Build 触发器以将代码从开发项目复制到生产项目。

错误是:

ERROR: (gcloud.run.deploy) User [project-number@cloudbuild.gserviceaccount.com] does not have permission to access namespaces instance [Project ID] (or it may not exist): Permission 'iam.serviceaccounts.actAs' denied on service account cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com (or it may not exist).

project-number@cloudbuild.gserviceaccount.com 具有以下权限:App Engine 管理员、BigQuery 作业用户、Cloud Build 服务帐户、Cloud Functions 管理员、Cloud Functions 开发人员、Cloud Scheduler 管理员、Editor 服务帐户、Token Creator 服务帐户用户、Pub/Sub编辑、Cloud Run 管理员、Secret Manager Secret Accessor、存储对象管理员

我找到了link 来解决另一个问题,该问题具有相同的问题。接受的解决方案是添加以下服务帐户和角色

Email: service-<account-id>@serverless-robot-prod.iam.gserviceaccount.com
Role: Google Cloud Run Service Agent

到 IAM 帐户。我试过了,得到了这个消息:No change: member already exists on the policy.错误可能在其他地方。

我还注意到帐户电子邮件cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com 出现在开发项目中,但不是生产项目。我认为这可能是问题的根源,但是当我尝试通过 IAM 页面添加此帐户(将项目 ID 更改为新项目的 ID)时,错误状态:Email addresses and domains must be associated with an active Google Account, Google Workspace account, or Cloud Identity account.

我不知道如何解决这个问题,感谢任何帮助。谢谢!

【问题讨论】:

  • 您能否提供更多关于您运行部署的项目、目标项目以及您可以拥有的其他跨项目信息的详细信息?有一些跨项目配置需要修复,我们需要更多细节。
  • 我在第二段中添加了更多细节。添加的信息是否可以理解?如有必要,我可以尝试再次解释。

标签: google-cloud-run google-cloud-build google-iam


【解决方案1】:

您正在从开发项目部署到生产项目。因此开发项目的云构建服务账号需要有部署到生产项目的权限。

所以,你需要

  • 授权开发项目的 Cloud Build 服务帐号在 Cloud Run 中创建/更新服务和修订
gcloud projects add-iam-policy-binding --member=serviceAccount:dev-project-number@cloudbuild.gserviceaccount.com --role=roles/run.admin prod-project-id
  • 授予开发项目的 Cloud Build 服务帐号模拟生产 Cloud Run 服务帐号(默认为计算服务帐号)
gcloud iam service-accounts add-iam-policy-binding --member=serviceAccount:dev-project-number@cloudbuild.gserviceaccount.com --role=roles/iam.serviceAccountUser prod-cloud-run-service-account --project=prod-project-id

让我知道这对你来说是否足够。

【讨论】:

  • 对于 prod-cloud-run-service-account,如果没有为此创建特殊的服务帐户,我应该使用 prod-project-id-compute@developer.gserviceaccount.com 吗?
  • 是的,如果它不是自定义服务帐户,则它是使用的默认服务帐户。对于 Cloud Fun,它是使用的计算引擎默认服务帐户。
  • 我已经运行了这些命令,并将一个小的更改推送到生产环境以触发触发器,但构建仍然失败并出现与以前相同的错误。
  • 您需要在服务帐户上授予 ServiceAccountUser 角色。我了解架构,但我可能理解错了!据我了解,您从开发项目运行 Cloud Build 作业,并尝试在 prod 项目中进行部署。如果是这样,我不明白为什么这些命令行不起作用(我对它们进行了测试,遇到了与您相同的问题并将其修复为那些)。如果您的架构不同,请描述它或根据您的上下文调整我的命令行。
  • 嗯,我想我可能把架构描述错了。一旦代码被推送到开发项目的主分支,就会有一个复制到生产的触发器将开发代码推送到生产项目的主分支。生产项目中的另一个触发器注意到此推送到 master,然后开始构建云运行实例。这会改变我必须做的事情吗?
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2016-12-26
  • 2016-03-01
  • 2021-08-18
相关资源
最近更新 更多