Google Cloud Build 在单独项目中部署 Cloudfunction 的正确权限
Posted
技术标签:
【中文标题】Google Cloud Build 在单独项目中部署 Cloudfunction 的正确权限【英文标题】:Correct permissions for Google Cloud Build to deploy a Cloudfunction in a separate project 【发布时间】:2020-02-20 23:07:17 【问题描述】:我们为“构建”和“生产”环境提供了单独的 GCP 项目。我想将 Cloud Build 用于“build”项目以在“prod”项目中部署 Cloud Function。关注documentation 时。
值得注意的是,如文档和@ 987654322@,运行构建时,我得到:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Forbidden], message=[调用者没有权限]
我的 cloudbuild.yaml 的简化示例是
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args: ['source', 'repos', 'clone', 'a_mirrored_repo', '--project=build-xxxx']
- name: 'gcr.io/cloud-builders/gcloud'
args: ['functions', 'deploy', 'some_function', '--trigger-http', '--runtime', 'python37', '--project', 'prod-yyyy']
我可以使用笔记本电脑上的 gsutil 命令行实用程序将我的功能部署到 prod,并且我可以使用我的 cloudbuild.yaml 将此功能部署到 build 项目。但我不确定我需要将哪些角色分配给哪些帐户,以使构建项目能够将云功能部署到产品项目。
【问题讨论】:
【参考方案1】:如果您想在 prod 项目中部署该功能,则必须将 build 项目的 Cloud Build 服务帐户添加为 prod 项目中的“Cloud Functions Developer”。如果我正确理解了您的描述,那么您已经在构建项目中进行了设置。
具体来说:在 GCP 控制台的 prod 项目中,在 IAM > members 下添加一个名为 [build-project-id]@cloudbuild.gserviceaccount.com
的新成员,并将角色“Cloud Functions Developer”添加到该成员。此时尝试部署可能会导致错误消息:
错误:(gcloud.functions.deploy)响应错误:状态=[403], code=[Forbidden], message=[缺少必要的权限 iam.serviceAccounts.actAs 用于 prod-xxxx@appspot.gserviceaccount.com 在项目 prod-xxxx 上。
请允许 prod-xxxx@appspot.gserviceaccount.com 角色/iam.serviceAccountUser 角色。
你可以通过运行来做到这一点 'gcloud 项目 add-iam-policy-binding prod-xxxx --member=prod-xxxx@appspot.gserviceaccount.com --role=roles/iam.serviceAccountUser'
错误消息中建议的命令略有不正确。正确的语法是:
gcloud projects add-iam-policy-binding prod-xxxx --member='serviceAccount:[build-project-number]@cloudbuild.gserviceaccount.com' --role='roles/iam.serviceAccountUser'
【讨论】:
这让我畅通无阻。我将编辑您的答案以包括我采取的具体步骤,以便在需要在 6 个月内再次解决时,它就在那里。以上是关于Google Cloud Build 在单独项目中部署 Cloudfunction 的正确权限的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Google Cloud Platform 中对服务帐户进行分组?
Google Cloud Build - source-context.json SHA不匹配。
如何在 Google App Engine 标准环境中使用 Google Cloud Build 或其他方法设置环境变量?