Cloud Build 无法部署到 Google App Engine - 您无权充当 @appspot.gserviceaccount.com

Posted

技术标签:

【中文标题】Cloud Build 无法部署到 Google App Engine - 您无权充当 @appspot.gserviceaccount.com【英文标题】:Cloud Build fails to deploy to Google App Engine - You do not have permission to act as @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,这似乎很奇怪。 【参考方案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/… 更新了文档 没关系,我在这里找到了答案:***.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/

【讨论】:

以上是关于Cloud Build 无法部署到 Google App Engine - 您无权充当 @appspot.gserviceaccount.com的主要内容,如果未能解决你的问题,请参考以下文章

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?

Google Cloud Build 无法运行 NX 受影响:应用程序,因为它无法引用 master~1 提交

部署到 Google Cloud Run 时 Docker 容器无法启动

Spring Boot 应用在部署到 Google App Engine 时无法连接到 Google Cloud SQL (PostgreSQL)

如何通过 cli / rest api / cloud 功能运行 Google Cloud Build 触发器?

Google Cloud Build 不会替换 cloudbuild.yaml 的机密部分中的值