假设我有一个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]
答案 0 :(得分:6)
https://cloud.google.com/cloud-build/docs/deploying-builds/deploy-cloud-run#before_you_begin
将Cloud Run Admin角色授予Cloud Build服务帐户:
在Cloud Console中,转到“ Cloud Build Settings”页面:
打开“设置”页面
找到具有Cloud Run Admin角色的行,并将其状态设置为ENABLED。
在“可能需要执行其他步骤”弹出窗口中,单击“跳过”。
将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
命令并设置它开始工作的每个选项之后。