为什么在部署容器时看到此错误:“错误:(gcloud.run.deploy)PERMISSION_DENIED:调用者没有权限”?

时间:2020-07-07 21:01:12

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

假设我有一个cloudbuild.yaml文件,如下所示。还要假设在将gcloud用于单独的功能(构建和运行)时,我可以手动运行和部署有问题的容器。

部署时,第三步将导致错误ERROR: (gcloud.run.deploy) PERMISSION_DENIED: The caller does not have permission

steps:
# Build the container image
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/[PROJECT_ID]/[IMAGE]:$COMMIT_SHA', '.']
# Push the image to Container Registry
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/[PROJECT_ID]/[IMAGE]:$COMMIT_SHA']
# Deploy image to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - 'run'
  - 'deploy'
  - '[SERVICE_NAME]'
  - '--image'
  - 'gcr.io/[PROJECT_ID]/[IMAGE]:$COMMIT_SHA'
  - '--region'
  - '[REGION]'
  - '--platform'
  - 'managed'
images:
- gcr.io/[PROJECT_ID]/[IMAGE]

3 个答案:

答案 0 :(得分:6)

请参阅以下文档:

https://cloud.google.com/cloud-build/docs/deploying-builds/deploy-cloud-run#before_you_begin


您需要按照此处可用的步骤进行操作:

  1. 将Cloud Run Admin角色授予Cloud Build服务帐户:

    • 在Cloud Console中,转到“ Cloud Build Settings”页面:

    • 打开“设置”页面

    • 找到具有Cloud Run Admin角色的行,并将其状态设置为ENABLED。

    • 在“可能需要执行其他步骤”弹出窗口中,单击“跳过”。

  2. 将IAM服务帐户用户角色授予Cloud Run运行时服务帐户上的Cloud Build服务帐户:

    • 在Cloud Console中,转到“服务帐户”页面:

    • 打开“服务帐户”页面

    • 在成员列表中,找到并选择[PROJECT_NUMBER] -compute@developer.gserviceaccount.com。这是 Cloud Run运行时服务帐户。

    • 单击右上角的“显示信息面板”。

    • 在“权限”面板中,单击“添加成员”按钮。

    • 在“新成员”字段中,输入Cloud Build服务帐户的电子邮件地址。这是形式 [PROJECT_NUMBER] @ cloudbuild.gserviceaccount.com。 注意:Cloud Build服务帐户的电子邮件地址与Cloud Run运行时服务帐户的电子邮件地址不同。

    • 在“角色”下拉列表中,选择“服务帐户”,然后选择“服务帐户用户”。

    • 单击“保存”。


就我而言,在步骤2的IAM建议中未显示@cloudbuild帐户,但是如果执行步骤1并运行构建,则错误消息将变为类似于以下已编辑消息的内容,其中包含您需要的帐户。

ERROR: (gcloud.run.deploy) User [<SOME_NUMBER_HERE>@cloudbuild.gserviceaccount.com] does not have permission to access namespace [<YOUR_PROJECT_ID>] (or it may not exist): Permission 'iam.serviceaccounts.actAs' denied on service account <SOME_OTHER_NUMBER_HERE>-compute@developer.gserviceaccount.com (or it may not exist).

答案 1 :(得分:2)

要通过 gcloud CLI 执行此操作:

gcloud run services add-iam-policy-binding [CLOUD_RUN_SERVICE_NAME] \ 
  --member=serviceAccount:[CLOUD BUILD SERVICE ACCOUNT EMAIL] \
  --role=roles/run.admin \
  --project=$PROJECT \
  --region=$REGION
gcloud iam service-accounts add-iam-policy-binding [SERVICE ACCOUNT THAT CLOUD RUN RUNS AS] \
  --member=serviceAccount:[CLOUD BUILD SERVICE ACCOUNT] \
  --role roles/iam.serviceAccountUser
  --project=$PROJECT \
  --region=$REGION

答案 2 :(得分:0)

如果您验证了您的服务帐户/角色并且一切正常, 您也可以初始化 gcloud sdk,在我的情况下,我在安装 gcloud sdk 并登录后处理该错误原因但从未对其进行初始化,因此项目、帐户/服务帐户等选项未正确设置 在我运行 gcloud init 命令并设置它开始工作的每个选项之后。