无法作为服务帐户部署到 google cloud run

Ali*_*irB 6 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
Run Code Online (Sandbox Code Playgroud)

这失败了:

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
Run Code Online (Sandbox Code Playgroud)

我已按照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-sdkdocker 映像进行部署。

Chr*_*nde 12

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

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

如此处所述,默认情况下:

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

这意味着您可以使用计算引擎默认服务帐户来进行部署(如果您愿意)还建议通过分配具有更受限制的 IAM 角色的专用服务账户,为每个 Cloud Run 服务授予更精细的权限。

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

  1. 创建一个具有执行问题中提到的部署所需权限的服务帐户。一般来说,您将需要:

    • Roles/run.admin给出run.services.createrun.services.update
    • Roles/iam.serviceAccountUser给出iam.serviceAccounts.actAs

最后一项是最重要的。由于您想使用非默认服务身份,因此帐户或部署者必须拥有iam.serviceAccounts.actAs正在部署的服务帐户的权限,如您在此处看到的。

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

  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]
Run Code Online (Sandbox Code Playgroud)

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

您可以在此处查看有关该--service-account标志的更多信息,但总而言之:

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

我希望它有帮助。