构建流程概览

将函数的源代码部署到 Cloud Run functions 时,该源代码存储在 Cloud Storage 存储桶中。Cloud Build 随后会自动将您的代码构建到容器映像中,并将该映像推送到映像注册表。当需要运行容器来执行函数时,Cloud Run functions 会访问此映像。如果您的函数仍在使用 Container Registry,您应尽快改用 Artifact Registry

构建映像的过程完全自动执行,不需要您直接输入。构建过程中使用的所有资源都会在您自己的用户项目中执行。

在您的项目中执行构建过程意味着:

  • 您可以直接访问所有构建日志。

  • 尽管 Cloud Build 确实有自己的默认并发配额,但没有预设的构建时间配额。

  • 您可以查看当前容器映像和以前部署的容器映像,这两个映像均存储在 Artifact Registry 中。

  • Cloud Storage 会在项目中用于存储函数的源代码目录。请注意以下几点:

    • 如果您使用 Google Cloud CLI 或 Google Cloud 控制台创建函数,系统会创建一个用于存储源代码的上传存储分区。此上传存储分区的名称可能为 gcf-v2-uploads-PROJECT_NUMBER-REGION.cloudfunctions.appspot.com
    • 上传代码后,函数代码会存储在单独的源代码存储分区中:
      • 如果您使用的是默认加密,则该存储桶的名称为 gcf-v2-sources-PROJECT_NUMBER-REGION
      • 如果您使用 CMEK 保护数据,则该存储桶的名称为 gcf-v2-sources-PROJECT_NUMBER-REGION-CMEK_KEY_HASH
    • 来源存储分区和上传存储分区都没有保留期限。

构建流程的特征

构建流程具有以下特征:

  • 您必须为您的项目启用 Cloud Build API

    如需手动启用 API,请点击前面的链接,从下拉菜单中选择您的项目,然后按照提示启用界面。

  • 因为整个构建流程都是在您的项目环境内进行的,所以该项目需要根据所包含资源的价格进行计费:

    • 如需了解 Cloud Build 价格,请参阅价格页面。此过程使用 Cloud Build 的默认实例大小,因为这些实例已经过预热,可以更快地投入使用。Cloud Build 提供了免费层级:请查看价格文档以进一步了解详情。

    • 如需了解 Cloud Storage 价格,请参阅价格页面。Cloud Storage 提供了免费层级:请查看价格文档以进一步了解详情。

    • 如需了解 Artifact Registry 价格,请参阅价格页面。

    • 如需了解 Container Registry(已弃用)价格,请参阅价格页面。

  • 由于构建过程需要计费,因此您的项目必须附加 Cloud Billing 账号

查看构建映像日志

将构建映像过程纳入您的用户项目的一个主要好处是可以访问构建日志。您可以使用 gcloud CLI 或 Google Cloud 控制台来访问日志,这些日志可通过 Cloud Logging 获得。

gcloud

  1. 使用 gcloud functions deploy 命令部署函数。

  2. 日志的网址在终端窗口中显示为响应的一部分。例如:

    Deploying function (may take a while - up to 2 minutes)...⠹
    **For Cloud Build Stackdriver Logs**, visit:
    https://console.cloud.google.com/logs/viewer?project=&advancedFilter=resource.type%
    3Dbuild%0Aresource.labels.build_id%3D38d5b662-2315-45dd-8aa2-
    380d50d4f5e8%0AlogName%3Dprojects%2F%
    2Flogs%2Fcloudbuild
    Deploying function (may take a while - up to 2 minutes)...done.

Google Cloud 控制台

如需在 Cloud Run 页面中查看函数日志,请执行以下操作:

  1. 转到 Cloud Run

  2. 在显示的列表中点击所选函数。

  3. 点击日志标签页,以获取此函数的所有修订版本的请求日志及容器日志。您可以按日志严重级别进行过滤。

映像注册表

Cloud Run functions 函数使用 Artifact Registry 来存储根据函数源代码构建的映像。映像存储在名为 REGION-docker.pkg.dev/PROJECT_ID/gcf-artifacts 的代码库中,该代码库位于创建函数的项目中。

如需指定自有 Artifact Registry 仓库,请运行以下命令:

gcloud functions deploy FUNCTION_NAME \
   --docker-registry=artifact-registry \
   --docker-repository=REPOSITORY \
   [FLAGS...]

替换以下内容:

  • FUNCTION_NAME:函数的名称。
  • REPOSITORY:完全限定的 Artifact Registry 代码库名称,格式如下:projects/PROJECT_NAME/locations/LOCATION/repositories/REPOSITORY

指定位于其他项目或区域中的 Artifact Registry 代码库时,您可能需要考虑其他配置:

IAM 配置:

  • 确保 build 服务账号已获授权对 REPOSITORY 执行读写操作。

网络配置

  • 确保可以从当前项目配置访问目标 REPOSITORY

    VPC Service Controls 配置:

    • 确保 build 服务账号可以访问 VPC-SC 边界内的目标 REPOSITORY

    数据驻留限制:

    • 请注意,如果在与函数所在区域不同的区域指定 REPOSITORY,则会导致数据跨区域传输。

找出使用 Container Registry 的函数

使用 Container Registry 的函数的函数说明中会包含 buildConfig.dockerRegistry 键。您可以按如下方式检索函数说明:

gcloud functions describe FUNCTION_NAME --no-gen2

FUNCTION_NAME 替换为您的函数的名称。

gcloud asset list \
   --content-type=resource \
   --asset-types=cloudfunctions.googleapis.com/Function \
   --organization=ORGANIZATION_ID \
   --filter "resource.data.buildConfig.dockerRegistry='CONTAINER_REGISTRY'"

ORGANIZATION_ID 替换为贵组织的资源 ID。

改用 Artifact Registry

您可以通过更改代码库设置,让函数将映像发布到 Artifact Registry:

gcloud functions deploy FUNCTION_NAME \
   --docker-registry=artifact-registry \
   --no-gen2 \
   [FLAGS...]

如需详细了解价格信息,请参阅 Cloud Run functions 价格

使用专用池保护构建

为了允许您的函数使用依赖项(例如 npm 软件包),Cloud Build 默认在构建过程中具有不受限制的互联网访问权限。如果您已设置 VPC Service Controls (VPC SC) 边界,并且希望限制构建仅可访问存储在边界内的依赖项,则可以使用 Cloud Build 专用工作器池功能。

一般来说,请按照以下步骤设置您的专用池:

  1. 创建专用工作器池。请参阅创建和管理专用池
  2. 配置 VPC Service Controls 边界。 请参阅使用 VPC Service Controls

  3. 如果专用工作器池与函数不在同一个项目中,则需要向 Cloud Run functions Service Agent 服务账号 (service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) 授予 cloudbuild.workerPoolUser 角色,以便 Cloud Build 服务可以访问工作器池。

    gcloud projects add-iam-policy-binding PRIVATE_POOL_PROJECT_ID \
        --member serviceAccount:service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
        --role roles/cloudbuild.workerPoolUser

    其中,FUNCTION_PROJECT_NUMBER 是运行函数的项目的编号PRIVATE_POOL_PROJECT_ID 是工作器池所在项目的 id。如需了解详情,请参阅在专用池中运行构建

部署函数以使用专用池进行构建:

gcloud functions deploy FUNCTION_NAME \
   --runtime RUNTIME \
   --build-worker-pool PRIVATE_POOL_NAME
   [FLAGS...]

其中,FUNCTION_NAME 是函数的名称,RUNTIME 是您正在使用的运行时,PRIVATE_POOL_NAME 是池的名称。

如需停止使用给定专用池,并使用默认 Cloud Build 池,请在重新部署时使用 --clear-build-worker-pool 标志。

gcloud functions deploy FUNCTION_NAME \
   --runtime RUNTIME \
   --clear-build-worker-pool
   [FLAGS...]

其中,FUNCTION_NAME 是函数的名称,RUNTIME 是您正在使用的运行时。

使用自定义服务账号保护 build

Cloud Run functions 函数会获取您的源代码,并将其发送到 Cloud Build 进行容器化。容器化函数存储在 Artifact Registry 中,并作为服务部署到 Cloud Run。默认情况下,Cloud Build 会在执行构建时分配一个服务账号充当主账号。从 2024 年 7 月开始,组织中的新项目将使用 Compute Engine 默认服务账号作为运行构建的主账号。如需了解详情,请参阅 Cloud Build 默认服务账号变更。出于安全原因,Compute Engine 默认服务账号的权限不足以执行构建。

对于在 2024 年 7 月之前创建的 Google Cloud 项目,Cloud Build 会使用旧版 Cloud Build 服务账号。该服务账号旨在帮助用户执行广泛的用例,这些用例可能对于您的项目需求来说过于宽松。如果您想将现有项目从此服务账号中移出,则可以采取以下步骤进一步保护您的函数构建环境:

  1. 禁止将旧版 Cloud Build 服务账号用于 build。
  2. 禁止将默认的计算服务账号用于 build。
  3. 配置具有适当范围的权限的新服务账号,以用于 build。
  4. 使用为 build 配置的服务账号。

禁止将旧版 Cloud Build 服务账号用于 build

您可以检查函数 build 的详细信息,以验证您的项目是否使用了旧版 Cloud Build 服务账号。默认 build 服务账号的格式如下:

PROJECT_NUMBER@cloudbuild.gserviceaccount.com

您可以将组织政策限制条件 cloudbuild.useBuildServiceAccount 设置为 Not Enforced,从而强制停用此服务账号。或者,移除其所有角色授权也会限制其访问 Google Cloud资源的权限。

禁止将默认的计算服务账号用于 build

默认的计算服务账号的格式为 PROJECT_NUMBER-compute@developer.gserviceaccount.com。您可以将组织政策 cloudbuild.useComputeServiceAccount 设为 Not Enforced,以禁止将其用作 build 的默认值。或者,您也可以停用此服务账号,以防止其用于访问 Google Cloud 资源。

提供用于构建函数的服务账号

在配置函数的过程中,可以在部署函数时指定 build 服务账号。当旧版 Cloud Build 服务账号和默认的 Compute 服务账号无法用于 build 时,必须指定 build 服务账号才能部署函数。

如需为您的函数配置和使用 build 服务账号,请参阅 Cloud Build 的自定义服务账号