Cloud Build 的自定义服务账号

Cloud Run functions 在构建和部署 Cloud Run functions 函数时会利用 Cloud Build。默认情况下,Cloud Run functions 在执行构建时,原则上使用默认的 Cloud Build 服务账号。从 2024 年 7 月开始,Cloud Build 更改了 Cloud Build 在新项目中使用服务账号的默认行为。Cloud Build 服务账号更改中详细说明了此更改。由于此更改,首次部署函数的新项目可能会使用权限不足的默认 Cloud Build 服务账号来构建函数。如果您受到此变更的影响,可以执行以下任一操作:

  • 查看 Cloud Build 指南,了解默认服务账号更改并选择不进行这些更改

  • 将 Cloud Build 账号角色 (roles/cloudbuild.builds.builder) 添加到默认的 Compute Engine 服务账号。

  • 为函数部署创建自定义 Build 服务账号。

本文档介绍了如何传入用户创建的服务账号,以供 Cloud Build 在部署函数时使用。

您可以使用 Google Cloud CLI、Google Cloud 控制台或 Cloud Run Functions API 通过自定义服务账号部署函数。

在如下一些场景中,您可能需要提供其他服务账号,以便在 Cloud Build 构建函数时使用:

  • 您希望更好地控制要添加到 VPC-SC 边界的服务账号。

  • 您希望 Cloud Build 以与默认服务账号不同的权限运行,而不必单独撤消每项权限。

  • 您希望专门为函数设置精细的 Cloud Build 权限,而不是共享针对其他用途进行优化的 Cloud Build 服务账号。

  • 您的组织已停用默认服务账号。

启用 API

此功能需要启用 IAM API。

使用 Google Cloud CLI 启用部署 Cloud Run 函数所需的 API,或使用 Google Cloud 控制台

gcloud services enable iam.googleapis.com

配置服务账号

本文档介绍了如何创建新的服务账号并授予所需的权限。如果要使用现有服务账号,则需要您打算使用的服务账号的电子邮件地址。如需了解详情,请参阅配置用户指定的服务账号

您可以按如下方式查看现有服务账号,也可以使用 Google Cloud 控制台:

gcloud iam service-accounts list

创建服务账号

使用 Google Cloud CLI 创建您的服务账号或使用 Google Cloud 控制台:

gcloud iam service-accounts create SA_EMAIL

SA_EMAIL 替换为您的服务账号的电子邮件地址。

授予权限

您使用的服务账号需要具有以下角色:

  • roles/logging.logWriter - 在 Cloud Logging 中存储构建日志时需要此角色。
  • roles/artifactregistry.writer - 在 Artifact Registry 中存储构建映像时需要此角色。 对于默认行为,服务账号需要访问名为“gcf-artifacts”和“cloud-run-source-deploy”的代码库。您可以在代码库的 IAM 政策中设置对代码库的访问权限。或者,您也可以通过 dockerRepository 字段提供自己的工件存储库。
  • roles/storage.objectViewer - 从 Cloud Storage 存储桶检索函数源代码以及将构建映像存储在 Container Registry 中需要此角色。 对于默认行为,服务账号需要访问名为“run-sources-*”“gcf-v2-sources-*”和“gcf-v2-uploads-*”的存储桶。可以通过向角色授予的权限添加 IAM 条件来实现此目的,例如: (resource.type == "storage.googleapis.com/Object" && (resource.name.startsWith("gcf-v2-sources-") || resource.name.startsWith("gcf-v2-uploads-") || resource.name.startsWith("run-sources-")))

使用 Google Cloud CLI 或使用 Google Cloud 控制台授予以下角色。

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
    --role=roles/logging.logWriter

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/artifactregistry.writer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectViewer

替换以下内容:

使用自定义服务账号部署函数

您可以使用 Google Cloud CLI 部署一个使用 Cloud Build 自定义服务账号的函数:

  • --build-service-account 标志指定其凭据用于构建步骤的 IAM 服务账号。如果未提供自定义服务账号,则该函数会将项目的默认服务账号用于 Cloud Build。
  • 您可以视需要使用通过 --build-worker-pool 标志指定的专用池

gcloud functions deploy FUNCTION_NAME \
   --gen2 \
   --region=REGION \
   --project=PROJECT_ID \
   --runtime=RUNTIME \
   --entry-point=CODE_ENTRYPOINT \
   --build-service-account=projects/PROJECT_ID/serviceAccounts/SA_EMAIL \
   --memory=256Mi \
   --trigger-http \
   --source=.

替换以下内容: