【问题标题】:Why am I seeing this error: 'ERROR: (gcloud.run.deploy) PERMISSION_DENIED: The caller does not have permission' while deploying container?为什么我在部署容器时看到此错误:'ERROR: (gcloud.run.deploy) PERMISSION_DENIED: The caller does not have permission'?
【发布时间】:2020-10-28 05:15:40
【问题描述】:

假设我有一个像下面这样的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 个。
  • @AhmetB-Google,已编辑以突出显示有问题的步骤。我在下面的回答突出了解决方案。

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


【解决方案1】:

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      查看文档:

      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 设置页面:

        • 打开设置页面

        • 找到具有 Cloud Run 管理员角色的行并将其状态设置为启用。

        • 在“可能需要附加步骤”弹出窗口中,单击“跳过”。

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

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

        • 打开服务帐户页面

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

        • 点击右上角的SHOW INFO PANEL。

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

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

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

        • 点击保存。


      在我的情况下,@cloudbuild 帐户未显示在第 2 步中的 IAM 建议中,但如果您执行第 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).
      

      【讨论】:

      • 这是正确的。 Tldr:基本上,“部署者”(在本例中为 cloudbuild 服务帐户)必须对正在部署的 Cloud Run 应用将使用的服务帐户拥有“充当”权限(以防止权限提升)。
      • 有人碰巧知道如何在命令行上使用 gcloud 执行此操作吗?
      • @Trevor 我认为这可行:gcloud run services add-iam-policy-binding [CLOUD_RUN_SERVICE_NAME] \ --member=serviceAccount:[CLOUD BUILD SERVICE ACCOUNT EMAIL] \ --role=roles/run .admin \ gcloud iam service-accounts add-iam-policy-binding [云运行的服务帐户] \ --member=serviceAccount:[CLOUD BUILD SERVICE ACCOUNT] \ --role roles/iam.serviceAccountUser --project= $PROJECT \ --region=$REGION
      • 这很有帮助,只想说声谢谢!
      • 为我工作。我只执行了第一步,它似乎已经解决了我的问题。
      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 2022-12-09
      • 1970-01-01
      • 2021-12-29
      • 2022-10-31
      • 2023-03-16
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多