错误:(gcloud.beta.functions.deploy) ... message=[调用者没有权限]

问题描述 投票:0回答:6

我正在尝试从此存储库部署代码:

https://github.com/anishkny/puppeteer-on-cloud-functions

在 Google Cloud Build 中。我的 cloudbuild.yaml 文件内容是:

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['beta', 'functions', 'deploy', 'screenshot', '--trigger-http', '--runtime', 'nodejs8', '--memory', '1024MB']

我已向我的 Cloud Build Service 帐户 (****@cloudbuild.gserviceaccount.com) 授予以下角色:

  • 云构建服务帐号
  • 云函数开发者

但是,在我的 Cloud Build 日志中,我看到以下错误:

starting build "1f04522c-fe60-4a25-a4a8-d70e496e2821"

FETCHSOURCE
Fetching storage object: gs://628906418368.cloudbuild-source.googleusercontent.com/94762cc396ed1bb46e8c5dbfa3fa42550140c2eb-b3cfa476-cb21-45ba-849c-c28423982a0f.tar.gz#1534532794239047
Copying gs://628906418368.cloudbuild-source.googleusercontent.com/94762cc396ed1bb46e8c5dbfa3fa42550140c2eb-b3cfa476-cb21-45ba-849c-c28423982a0f.tar.gz#1534532794239047...
/ [0 files][    0.0 B/  835.0 B]                                                
/ [1 files][  835.0 B/  835.0 B]                                                
Operation completed over 1 objects/835.0 B.                                      
tar: Substituting `.' for empty member name
BUILD
Already have image (with digest): gcr.io/cloud-builders/gcloud
ERROR: (gcloud.beta.functions.deploy) ResponseError: status=[403], code=[Forbidden], message=[The caller does not have permission]
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/gcloud" failed: exit status 1

我错过了什么?

google-cloud-functions google-cloud-build
6个回答
13
投票

在阅读了大量文档后,我也遇到了这个问题。上述答案的结合使我走上了正确的道路。基本上,需要类似以下内容:

PROJECT=[PROJECT-NAME]

NUM=$(gcloud projects describe $PROJECT --format='value(projectNumber)')

gcloud iam service-accounts add-iam-policy-binding \
${PROJECT}@appspot.gserviceaccount.com \
--member=serviceAccount:${NUM}@cloudbuild.gserviceaccount.com \
--role=roles/iam.serviceAccountUser \
--project=${PROJECT}

gcloud iam service-accounts add-iam-policy-binding \
    ${PROJECT}@[INSERT_YOUR_IAM_OWNER_SERVICE_ACCOUNT_NAME].iam.gserviceaccount.com \
    --member='serviceAccount:service-${NUM}@gcf-admin-robot.iam.gserviceaccount.com' \
    --role='roles/iam.serviceAccountUser'  

此外,我还通过 IAM 控制台将“Cloud Functions Developer”角色添加到我的 @cloudbuild.gserviceaccount.com 帐户。


11
投票

根据Cloud Build 文档,对于 Cloud Functions,您必须向您的服务帐户授予“项目编辑器”角色。

但是,Cloud Functions 文档 指出,除了使用项目编辑器角色之外,您还可以使用“Cloud Functions 开发人员角色[但必须]确保您已授予服务帐户用户角色”。关于服务帐户,它表示拥有“项目上的 CloudFunctions.ServiceAgent 角色”并且“拥有触发源的权限,例如触发您的函数的 Pub/Sub 或 Cloud Storage 存储桶”。

出于这些考虑,我的理解是,文档省略了指定您的服务帐户所需的所有角色,而是直接指示授予项目编辑器角色。


1
投票

您必须在 Cloud Build 设置页面上更新服务帐户权限。 这是说明 https://cloud.google.com/cloud-build/docs/deploying-builds/deploy-cloud-run#complete-management

您只需在该页面上将 Cloud Run 管理员角色的状态设置为“已启用”即可:

enter image description here


0
投票

使用 auth 开始您的云构建

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['auth', 'activate-service-account', '[email protected]', '--key-file=account.json', '--project=rabbito-dev']

然后简单地将您的代码部署在云函数上

- name: 'gcr.io/cloud-builders/gcloud'
  args: ['beta', 'functions', 'deploy', 'screenshot', '--trigger-http', '--runtime', 'nodejs8', '--memory', '1024MB']

0
投票

请将“Cloud Functions Service Agent”角色与“Cloud Functions Developer”一起添加到您的服务帐户。


0
投票

如果您使用云构建默认工作池进行构建,则需要 添加对云构建 iam 的访问权限

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:[email protected]" \
    --role="roles/cloudbuild.serviceAgent"

© www.soinside.com 2019 - 2024. All rights reserved.