错误: (gcloud.beta.functions.deploy) ... message=[调用者没有权限]
Posted
技术标签:
【中文标题】错误: (gcloud.beta.functions.deploy) ... message=[调用者没有权限]【英文标题】:ERROR: (gcloud.beta.functions.deploy) ... message=[The caller does not have permission] 【发布时间】:2019-01-24 22:12:59 【问题描述】:我正在尝试从这个 repo 部署代码:
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 服务帐号 云函数开发者然而,在我的 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
我错过了什么?
【问题讨论】:
您是如何将角色分配给服务帐户的?我写了一篇类似的帖子,我打电话告诉你以下形式的内容应该提供正确的角色:NUM=$(gcloud projects describe $PROJECT \ --format='value(projectNumber)') gcloud projects add-iam-policy-binding $PROJECT \ --member=serviceAccount:$NUM@cloudbuild.gserviceaccount.com \ --role=roles/cloudfunctions.developer
(medium.com/google-cloud/…)
@DazWilkin 我从 GCP Console IAM 页面 (console.cloud.google.com/iam-admin/iam) 分配了角色。那么,您的 **@cloudbuild.gserviceaccount.com 服务帐号会在 GCP Console 中显示哪些角色?
【参考方案1】:
当(可能)Cloud Functions 进入 GA 时,权限似乎发生了变化。今天另一位客户提出了这个问题,我想起了你的问题。
Cloud Build 机器人 ($NUM@cloudbuild.gserviceaccount.com
) 还需要是 $PROJECT-ID@appspot.gserviceaccount.com
帐户的 serviceAccountUser:
注意虽然 Cloud Build 机器人本地部分是项目编号 ($NUM
),但 apppot 机器人本地部分是项目 ID ($PROJECT
)
请尝试:
PROJECT=[[YOUR-PROJECT-ID]]
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
告诉我!
【讨论】:
啊哈! cloud.google.com/functions/docs/reference/iam/… 就是这样!来自 AWS 世界,IMO 这是太多的配置,但它就是这样。这是一个更新的链接cloud.google.com/functions/docs/reference/iam/… 太棒了!是的,这个配置特别粗糙,因为需要授予 Cloud Build 的服务帐户使用另一个服务帐户的权限。这是粒度的结果。很高兴听到您成功了。【参考方案2】:在阅读了相当多的文档后,我也遇到了这个问题。以上答案的组合使我走上了正确的道路。基本上,需要以下内容:
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 帐户。
【讨论】:
我在没有第二个gcloud iam service-accounts add-iam-policy-binding...
命令的情况下完成了这项工作。
oohhh jesus...他们说来 GCP,他们说会很有趣 :(【参考方案3】:
根据Cloud Build documentation,对于 Cloud Functions,您必须将“项目编辑”角色授予您的服务帐户。
但是,Cloud Functions documentation 指出,除了使用项目编辑角色之外,您还可以使用“Cloud Functions 开发人员角色 [但您必须] 确保您已授予服务帐户用户角色”。关于服务帐户,它表示具有“您的项目的 CloudFunctions.ServiceAgent 角色”和“具有触发源的权限,例如 Pub/Sub 或触发您的功能的 Cloud Storage 存储桶”。
由于这些考虑,我的理解是文档省略了指定您的服务帐户所需的所有角色,并直接指示授予项目编辑角色。
【讨论】:
谢谢。添加 Role="Project > Editor" 似乎可以解决它。但这似乎是一个过于宽容的角色,不是吗?我认为“云功能开发人员”(+ CB 服务帐户)就足够了。哦,好吧...谢谢!【参考方案4】:您必须在 Cloud Build 设置页面上更新服务帐号权限。 这是说明https://cloud.google.com/cloud-build/docs/deploying-builds/deploy-cloud-run#fully-managed
您只需在该页面上将 Cloud Run 管理员角色的状态设置为启用:
【讨论】:
【参考方案5】:使用身份验证开始您的云构建
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args: ['auth', 'activate-service-account', 'xoxox@xoxo-dev.iam.gserviceaccount.com', '--key-file=account.json', '--project=rabbito-dev']
然后只需将您的代码部署在云功能上
- name: 'gcr.io/cloud-builders/gcloud'
args: ['beta', 'functions', 'deploy', 'screenshot', '--trigger-http', '--runtime', 'nodejs8', '--memory', '1024MB']
【讨论】:
以上是关于错误: (gcloud.beta.functions.deploy) ... message=[调用者没有权限]的主要内容,如果未能解决你的问题,请参考以下文章