【问题标题】:Cannot deploy as a service account to google cloud run无法作为服务帐户部署到谷歌云运行
【发布时间】:2020-04-20 17:52:29
【问题描述】:

我正在努力为服务帐户启用部署到云运行。我的逻辑看起来像:

gcloud auth activate-service-account \
  cloud-run-deployer@my-project.iam.gserviceaccount.com \
  --key-file=my-project-123123213.json

gcloud run deploy my-project-action \
  --image "gcr.io/my-project/my-project-action:dev" \
  --project my-project \
  --verbosity debug \
  --region us-central1 \
  --allow-unauthenticated \
  --platform managed

这失败了:

HttpForbiddenError: HttpError accessing <https://us-central1-run.googleapis.com/apis/serving.knative.dev/v1/namespaces/my-project/services/my-project-action?alt=json>: response: <{'status': '403', 'content-length': '126', 'x-xss-protection': '0', 'x-content-type-options': 'nosniff', 'transfer-encoding': 'chunked', 'vary': 'Origin, X-Origin, Referer', 'server': 'ESF', '-content-encoding': 'gzip', 'cache-control': 'private', 'date': 'Wed, 01 Jan 2020 23:08:29 GMT', 'x-frame-options': 'SAMEORIGIN', 'alt-svc': 'quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000', 'content-type': 'application/json; charset=UTF-8'}>, content <{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}
>
ERROR: (gcloud.run.deploy) PERMISSION_DENIED: The caller does not have permission

我的服务帐户已按照https://cloud.google.com/run/docs/reference/iam/roles#additional-configuration 的步骤操作。例如。它具有项目级别roles/run.adminroles/iam.serviceAccountUser。我也尝试为该项目提供roles/editorroles/owner,但结果相同。我可以在我的123213123123-compute@developer.gserviceaccount.com 用户上看到cloud-run-deployer@my-project.iam.gserviceaccount.com 是服务帐户用户。

如果我使用gcloud auth login 进行身份验证,我可以使用相同的部署命令进行部署。

使用cloud-run-deployer@my-project.iam.gserviceaccount.com 和相同的身份验证方法,我能够将新的 docker 映像推送到容器注册表,所以我认为身份验证过程有效,但是我缺少一些云运行部署的权限或某些东西。

顺便说一句,我正在从 cloud-sdk docker 映像进行部署。

【问题讨论】:

  • cloud-run-deployer@my-project.iam.gserviceaccount.com分配了哪些角色
  • 您是否检查了身份验证是否正常?以gcloud run services list 为例。
  • 对不起,我在其他事情上跑题了,但我会回到这个。我现在正在尝试使用 terraform 来管理我的 gcp 资源,所以我们会看看这是否有帮助。

标签: google-cloud-platform google-cloud-run


【解决方案1】:

我试图重现该问题,我可以说这对我有用。与 Google Cloud 中的其他服务一样,Google Cloud Run 的问题在于它们使用服务身份

在执行期间,Cloud Run 修订版使用服务帐号作为其身份。这意味着,当您的代码使用 Google Cloud 客户端库时,它会自动从当前 Cloud Run 修订版的运行时服务帐号获取并使用凭据。此策略称为“应用程序默认凭据”。

here 所述,默认情况下:

Cloud Run 修订版使用 Compute Engine 默认服务帐号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com),该帐号具有 Project > Editor IAM 角色。这意味着默认情况下,您的 Cloud Run 修订版对您的 Google Cloud 项目中的所有资源具有读写权限。

这意味着如果您愿意,您可以使用计算引擎默认服务帐户进行部署。还建议通过具有更多受限 IAM 角色的 assigning dedicated service accounts 向您的每个 Cloud Run 服务授予更精细的权限。

如果您想创建一个新的服务帐号并将其用作将容器部署到 Google Cloud Run 的帐号,您需要:

  1. 使用您在问题中提到的permissions necessary to do deployments 创建一个服务帐户。一般来说,您需要:

    • roles/run.admin 提供run.services.createrun.services.update
    • roles/iam.serviceAccountUser 提供iam.serviceAccounts.actAs

最后一个是最重要的。由于您想使用非默认服务身份,帐户或部署者必须对正在部署的服务帐户拥有iam.serviceAccounts.actAs 权限,如您所见here.

  1. 一旦您的服务帐户拥有此权限,您就可以使用您提供的命令使用该服务帐户(非默认身份)部署新服务,但添加--service-account 标志,如图所示here:

  gcloud run deploy my-project-action \
  --image "gcr.io/my-project/my-project-action:dev" \
  --project my-project \
  --verbosity debug \
  --region us-central1 \
  --allow-unauthenticated \
  --platform managed \
  --service-account [SERVICE_ACCOUNT]

应该可以使用gcloud run deploy,但如果不行,你也可以试试gcloud beta run deploy

您可以看到有关--service-account 标志here 的更多信息,但总而言之:

与服务修订相关联的 IAM 服务账户的电子邮件地址。服务帐户代表正在运行的修订版的身份,并确定修订版具有哪些权限。 如果未提供,修订将使用项目的默认服务帐号。

希望对你有帮助。

【讨论】:

  • 谢谢,过几天试试看。
  • 我对这里的概念感到困惑。假设我有一个应用程序容器,它使用项目 A 中的服务帐户 A 来访问该项目中的 GBQ 资源。现在假设我想将应用程序部署到云运行托管。这是否意味着我也必须使用帐户 A 来部署云运行服务? imo,服务账户 A 真的应该只被授予与应用程序逻辑相关的权限,为什么它必须处理云运行部署过程?
【解决方案2】:

我想总结一下我在同一主题上的挣扎。

就我而言,这有点不同,因为我也使用 Cloud SQL。关键是错误是一样的。

用于部署的服务帐号需要拥有所有必需的权限。

最基本的在文档中,Cloud Run AdminService Account User

但是,在我使用 Cloud SQL 的情况下,Cloud SQL Viewer 角色也是必需的。

这个故事的难点在于,它总是显示为失踪gcloud.run.deploy

【讨论】:

    【解决方案3】:

    Cloud SQL 在 Cloud Run 上权限不足

    在将 Postgres 数据库迁移到 Google 之后,我在构建过程中遇到了这个错误。鉴于@spicydog 的回答提供了出色的建议,这是我对该问题的具体解决方案。

    发生这种情况是因为我尚未将使用我们在 Google 的新 Postgres 数据库的正确权限角色授予我们的云构建和云运行服务帐户。

    授予正确的IAM 角色的步骤

    该解决方案的要点是,如果您使用文档建议的默认设置,您需要将角色添加到至少两个服务帐户。

    1。将Cloud SQL Client 角色添加到您的默认云运行服务帐户

    我的问题是我的默认云运行服务帐户缺少适当的权限。来自文档:

    Cloud Run(全托管)使用服务帐号来授权您与 Cloud SQL 的连接。此服务帐户必须具有正确的 IAM 权限才能成功连接。除非另有配置,否则默认服务帐户的格式为 PROJECT_NUMBER-compute@developer.gserviceaccount.com。

    在连接两个不同项目中的资源时,请确保两个项目都启用了正确的 IAM 角色并为服务帐号授予了正确的权限。

    确保您的服务的服务帐号具有以下 IAM 角色之一:

    • Cloud SQL 客户端(首选)
    • 云 SQL 编辑器
    • 云 SQL 管理员

    所以我按照他们的指示将Cloud SQL Client 角色添加到我的${PROJECT_NUMBER}-compute@developer.gservice.com 服务帐户。

    2。将Cloud SQL Admin 角色添加到您的云构建服务帐户

    手指交叉,构建进行,No está bien!由于@spicydog 似乎表示需要角色的两个服务帐户,我将Cloud SQL Admin 角色添加到我的云构建服务帐户${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com

    参考文献

    这里是docs,了解如何为用户添加角色。他们的前端非常出色,恕我直言。

    使用的其他人:

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 2020-06-28
      • 2017-06-25
      • 2019-05-23
      • 1970-01-01
      • 2017-08-15
      • 2021-02-26
      • 2021-10-09
      相关资源
      最近更新 更多