【问题标题】:Cloud Build fails to deploy to Google App Engine - You do not have permission to act as @appspot.gserviceaccount.comCloud Build 无法部署到 Google App Engine - 您无权充当 @appspot.gserviceaccount.com
【发布时间】:2021-01-21 23:06:35
【问题描述】:

今天早上我做了一个 PR,触发了我的暂存环境的 Cloud Build,但未能将结果部署到 GAE。

错误如下:

错误:(gcloud.app.deploy)PERMISSION_DENIED:您无权充当“[redacted]@appspot.gserviceaccount.com” 步骤#4:-'@type':type.googleapis.com/google.rpc.ResourceInfo 步骤#4:描述:您无权充当此服务帐户。 第 4 步:资源名称:[已编辑]@appspot.gserviceaccount.com 第 4 步:resourceType: serviceAccount

当我看到https://console.cloud.google.com/cloud-build/settings/service-account Cloud build 具有以下服务帐户权限已启用

  • App 引擎管理员
  • 云 KMS

检查https://console.cloud.google.com/iam-admin/iam 可以看到cloudbuild服务账号有以下角色:

  • App 引擎管理员
  • App Engine 部署者
  • Cloud Build 服务帐号
  • 云 KMS CryptoKey 解密器

【问题讨论】:

  • 嗨@LawsonTaylor 考虑到您看到的错误消息,这可能与默认 Cloud Build 服务帐户不允许访问部署 App Engine 的事实有关。您能否按照here 的步骤向您的 Cloud Build 服务帐户授予部署者权限?
  • @gso_gabriel 对于我的项目,这已经工作了很长一段时间,但今天早上停止工作。此文档可能需要更新:cloud.google.com/cloud-build/docs/deploying-builds/… - 我只有文档所示的“App Engine Admin”权限。我按照您的链接建议添加了“App Engine Deployer”IAM 权限,但它仍然不起作用。
  • 只是为了添加更多细节,这绝对是 GCP 中最近的变化/回归。我的构建帐户以前具有 App Engine Deployer 角色,但最近的构建开始失败。我不得不使用@Nebulastic 的答案来修复。如果 App Engine 团队可以用错误编号发表评论,那就太好了 - 单独拥有“App Engine Deployer”角色已不足以实际部署 App Engine,这似乎很奇怪。

标签: google-app-engine google-cloud-platform service-accounts google-cloud-build


【解决方案1】:

根据提供的错误,您似乎需要向您的服务帐户添加一些委托。这意味着服务帐户可以代表另一个服务帐户进行操作。不要在项目级别添加此权限,因为它会带来安全风险!您可以在下面找到如何在另一个服务帐户上添加 roles/iam.serviceAccountUser 的示例。

PROJECT_ID=xxxxxx

PROJECT_NUMBER=$(gcloud projects list \
  --format="value(projectNumber)" \
  --filter="projectId=${PROJECT_ID}")

gcloud iam service-accounts add-iam-policy-binding \
    ${PROJECT_ID}@appspot.gserviceaccount.com \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser \
    --project=${PROJECT_ID}

总而言之,服务帐户必须具有iam.serviceAccounts.actAs 权限,该权限包含在roles/iam.serviceAccountUser 角色中。更新的 Google 文档可以在 here 找到。

【讨论】:

  • 从今天早上(2020-10-09)开始,我们的一些部署开始失败,这解决了它。在我们的例子中,我们使用的是:gcloud --quiet --project "$GOOGLE_PROJECT_NAME" app deploy app.yaml,并且部署之前已经运行了几个月。
  • 是的,但您的权限在项目级别,应该在服务帐户级别。说“它有效”并不总是最好的解决方案。
  • 您可以使用 gcloud sdk 在命令行上执行此操作。
  • 我已经在 Google 问题跟踪器上填写了一个问题(请参阅issuetracker.google.com/issues/170538212),在回复中 Google 确认现在需要 serviceAccountUser 角色。他们还在cloud.google.com/appengine/docs/flexible/nodejs/… 更新了文档
  • 没关系,我在这里找到了答案:stackoverflow.com/a/61336174/6181476。谢谢,伙计!
【解决方案2】:

我有同样的问题。对我来说,我必须在 IAM 中将 Service Account User 角色添加到我的 circle ci 用户。也许您可以为 cloudbuild 做同样的事情。

【讨论】:

  • 这对我也有用,看起来有些东西已经改变了,但是文档是最新的,包含自动化所需的角色。 cloud.google.com/appengine/docs/standard/python/roles
  • 只为服务帐户赋予“服务帐户用户”角色过于宽泛,基本上将项目的管理员权限授予您的部署者/cloudbuild 服务帐户。应该使用gcloud iam service-accounts add-iam-policy-binding 将角色仅绑定到“[redacted]@appspot.gserviceaccount.com”SA。见answer from Nebulastic
  • 完全同意@Mayeu,这样您的 cloudbuild 服务帐户几乎可以在项目中执行任何操作,而不是最佳实践。范围应该只是需要为其委派权限的服务帐户。
  • 我使用了 CircleCI 并批准了这个解决方案
  • 虽然这可行,但您在这里制造了一个严重的安全问题。切勿在项目 IAM 中设置服务帐户用户角色,因为它允许用户帐户充当任何其他用户帐户。
【解决方案3】:

我向我的 CI/CD 服务帐户授予 Service Account User 权限。这行得通。

IAM 的屏幕截图

我的 Gitlab CI/CD 配置的屏幕截图

【讨论】:

  • 这基本上是过度许可,因为服务帐户现在可以代表项目中的所有其他服务帐户。请参阅我的答案以获取解决方案。
【解决方案4】:

要解决此问题,您可以将Service Account User IAM 权限添加到您的 CI/CD 管道服务帐户。

例如。如果您使用的是 Cloud Build,请将Service Account User 角色添加到您的{project-number}@cloudbuild.gserviceaccount.com 服务帐号

【讨论】:

  • 这个角色太宽泛了。您应该只在服务帐户级别指定它。否则,任何使用 cloudbuild 的人都可以充当另一个服务帐户,从而造成严重的安全问题。
【解决方案5】:

看起来这个问题的答案似乎是通过将.ActAs 权限添加到 Gitlab 或 CircleCI 帐户。

我还没有机会测试 - 如果其他人有并且可以发布详细信息 - 请这样做;

这是我能收集到的建议答案: How do you enable "iam.serviceAccounts.actAs" permissions on a sevice account?

Nebulastic 在上面有一个非常好的答案,但 {PROJECT_ID} 需要与 Gitlab 或 CircleCI 帐户名称交换,而不是项目名称帐户。

【讨论】:

  • 您是正确的,当您使用 Cloud Build 之外的其他构建工具(例如 Gitlab、CircleCI、Bitbucket)时,服务帐户是不同的。然而,这显然不是最初的问题。
  • 可以说不清楚 - 因为我是通过 Google Fu 发现这篇文章的,我相信其他人也有这个帖子......因此,我本着支持的精神分享了与该帖子高度相关的有用信息社区,@Nebulastic。
【解决方案6】:

首先我们进入权限管理器,选择我们要添加权限的项目; https://console.cloud.google.com/iam-admin/

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 2020-05-06
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多