无法作为服务帐户部署到Google Cloud Run

时间:2020-01-01 23:45:10

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

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

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进行身份验证,则可以使用相同的deploy命令进行部署。

使用cloud-run-deployer@my-project.iam.gserviceaccount.com和相同的auth方法,我能够将新的docker映像推送到容器注册表,因此我认为auth进程有效,但是我缺少一些权限或某些用于云运行部署的权限。 / p>

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

3 个答案:

答案 0 :(得分:2)

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

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

here所述,默认情况下:

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

这意味着如果需要,您可以使用计算引擎默认服务帐户进行部署。还建议通过assigning dedicated service accounts使用受限制的IAM角色为每个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标志,如图{{3}所示}

  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服务帐户的电子邮件地址。服务帐户代表正在运行的修订的身份,并确定该修订具有什么权限。 如果未提供,则修订将使用项目的默认服务帐户。

我希望这会有所帮助。

答案 1 :(得分:1)

我想总结一下我在同一主题上的努力。

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

用于部署的服务帐户必须具有所有必需的权限。

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

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

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

答案 2 :(得分:0)

Cloud SQL 在云运行中权限不足

将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 Client(首选)
  • Cloud SQL编辑器
  • Cloud SQL管理员

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

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

手指越过,建立前进,没有estábien!由于@spicydog似乎指示两个服务帐户需要角色,因此我将Cloud SQL Admin角色添加到了我的云构建服务帐户${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com

参考文献

此处docs介绍了如何向用户添加角色。他们的前端是卓越的恕我直言。

其他利用的东西: