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 超时

Google Cloud Build - source-context.json SHA不匹配。

如何在 Google App Engine 标准环境中使用 Google Cloud Build 或其他方法设置环境变量?

从 Google Cloud Build 访问存储在 Google Secret Manager 中的环境变量

在 Google Cloud Build 中使用 python 插件编译 protobuf 消息