使用自定义服务帐户部署到云 运行 失败,出现 iam.serviceaccounts.actAs 错误
Deploying to Cloud Run with a custom service account failed with iam.serviceaccounts.actAs error
我在我的项目上创建了一个自定义服务帐户 travisci-deployer@PROJECT_ID.iam.gserviceaccount.com
并赋予它 Cloud 运行 Admin 角色:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
--role="roles/run.admin"
然后我将此服务帐户设置为我的 gcloud 命令的身份:
gcloud auth activate-service-account --key-file=google-key.json
但是当我 运行 gcloud beta run deploy
命令时,我得到一个关于 "Compute Engine default service account" 没有 iam.serviceAccounts.actAs
权限的错误:
gcloud beta run deploy -q "${SERVICE_NAME}" \
--image="${CONTAINER_IMAGE}" \
--allow-unauthenticated
Deploying container to Cloud Run service [$APP_NAME] in project [$PROJECT_ID] region [us-central1]
Deploying...
Deployment failed
ERROR: (gcloud.beta.run.deploy) PERMISSION_DENIED: Permission 'iam.serviceaccounts.actAs'
denied on service account 1075231960084-compute@developer.gserviceaccount.com
这对我来说似乎很奇怪(因为我没有使用 GCE 默认服务帐户标识,尽管它在部署应用程序后由 Cloud 运行 应用程序使用)。
所以 1075231960084-compute@developer.gserviceaccount.com
帐户用于 API 调用,而不是我在 gcloud
上配置的 travisci-deployer@PROJECT_ID.iam.gserviceacount
服务帐户?
我该如何解决这个问题?
目前,在测试版中,所有 Cloud 运行 服务 运行 作为默认计算帐户(与 Google Compute Engine 默认服务帐户相同)。
运行 服务作为不同服务帐户的功能将在未来版本中提供。
TLDR:将 Cloud 运行 Admin 和 Service Account User 角色添加到您的服务帐户.
如果我们详细阅读云 运行 的 IAM 参考页面的文档 here,我们会发现以下文本:
A user needs the following permissions to deploy new Cloud Run
services or revisions:
run.services.create
and run.services.update
on the project level.
Typically assigned through the roles/run.admin
role. It can be changed
in the project permissions admin page.
iam.serviceAccounts.actAs
for
the Cloud Run runtime service account. By default, this is
PROJECT_NUMBER-compute@developer.gserviceaccount.com
. The permission
is typically assigned through the roles/iam.serviceAccountUser
role.
我认为这些额外的步骤可以解释您所看到的故事。
向我自己的服务帐户添加 Cloud 运行 Admin 和 Service Account User 角色为我解决了这个问题。请参阅此处文档中的步骤 2:
https://cloud.google.com/run/docs/continuous-deployment#continuous
虽然您可以通过授予帐户作为 Compute Engine 默认服务帐户的权限来解决此特定错误,但这违反了 "best practices" advice:
By default, Cloud Run services run as the default Compute Engine service account. However, Google recommends using a user-managed service account with the most minimal set of permissions. Learn how to deploy Cloud Run services with user-managed service accounts in the Cloud Run service identity documentation.
您可以指示云 运行 部署将采用哪个服务帐户身份,如下所示:
gcloud run deploy -q "${SERVICE_NAME}" \
--image="${CONTAINER_IMAGE}" \
--allow-unauthenticated \
--service-account "${SERVICE_ACCOUNT_EMAIL}"
我在我的项目上创建了一个自定义服务帐户 travisci-deployer@PROJECT_ID.iam.gserviceaccount.com
并赋予它 Cloud 运行 Admin 角色:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
--role="roles/run.admin"
然后我将此服务帐户设置为我的 gcloud 命令的身份:
gcloud auth activate-service-account --key-file=google-key.json
但是当我 运行 gcloud beta run deploy
命令时,我得到一个关于 "Compute Engine default service account" 没有 iam.serviceAccounts.actAs
权限的错误:
gcloud beta run deploy -q "${SERVICE_NAME}" \
--image="${CONTAINER_IMAGE}" \
--allow-unauthenticated
Deploying container to Cloud Run service [$APP_NAME] in project [$PROJECT_ID] region [us-central1]
Deploying...
Deployment failed
ERROR: (gcloud.beta.run.deploy) PERMISSION_DENIED: Permission 'iam.serviceaccounts.actAs'
denied on service account 1075231960084-compute@developer.gserviceaccount.com
这对我来说似乎很奇怪(因为我没有使用 GCE 默认服务帐户标识,尽管它在部署应用程序后由 Cloud 运行 应用程序使用)。
所以 1075231960084-compute@developer.gserviceaccount.com
帐户用于 API 调用,而不是我在 gcloud
上配置的 travisci-deployer@PROJECT_ID.iam.gserviceacount
服务帐户?
我该如何解决这个问题?
目前,在测试版中,所有 Cloud 运行 服务 运行 作为默认计算帐户(与 Google Compute Engine 默认服务帐户相同)。
运行 服务作为不同服务帐户的功能将在未来版本中提供。
TLDR:将 Cloud 运行 Admin 和 Service Account User 角色添加到您的服务帐户.
如果我们详细阅读云 运行 的 IAM 参考页面的文档 here,我们会发现以下文本:
A user needs the following permissions to deploy new Cloud Run services or revisions:
run.services.create
andrun.services.update
on the project level. Typically assigned through theroles/run.admin
role. It can be changed in the project permissions admin page.iam.serviceAccounts.actAs
for the Cloud Run runtime service account. By default, this isPROJECT_NUMBER-compute@developer.gserviceaccount.com
. The permission is typically assigned through theroles/iam.serviceAccountUser
role.
我认为这些额外的步骤可以解释您所看到的故事。
向我自己的服务帐户添加 Cloud 运行 Admin 和 Service Account User 角色为我解决了这个问题。请参阅此处文档中的步骤 2: https://cloud.google.com/run/docs/continuous-deployment#continuous
虽然您可以通过授予帐户作为 Compute Engine 默认服务帐户的权限来解决此特定错误,但这违反了 "best practices" advice:
By default, Cloud Run services run as the default Compute Engine service account. However, Google recommends using a user-managed service account with the most minimal set of permissions. Learn how to deploy Cloud Run services with user-managed service accounts in the Cloud Run service identity documentation.
您可以指示云 运行 部署将采用哪个服务帐户身份,如下所示:
gcloud run deploy -q "${SERVICE_NAME}" \
--image="${CONTAINER_IMAGE}" \
--allow-unauthenticated \
--service-account "${SERVICE_ACCOUNT_EMAIL}"