构建流程概览

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

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

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

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

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

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

  • Cloud Storage 会直接在项目中使用,并且函数的源代码目录存储在项目内的存储桶中。 注意事项:

    • 如果您使用的是默认加密,则该存储桶的名称为 gcf-sources-PROJECT_NUMBER-REGION
    • 如果您使用 CMEK 保护数据,则该存储桶的名称为 gcf-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 控制台

  1. Cloud Run functions 概览窗口中,点击要调查的函数的名称。
  2. 点击详情标签页。
  3. 一般信息窗格中,点击容器构建日志链接以打开日志浏览器窗格。
  4. 点击任何行即可查看该构建日志条目的详细信息。如果是与文件相关的错误条目,则这些详细信息包括文件的名称、行和列。

映像注册表

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

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

gcloud

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

替换以下内容:

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

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

IAM 配置:

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

网络配置

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

VPC Service Controls 配置:

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

数据驻留限制:

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

Google Cloud 控制台

  1. 前往 Google Cloud 控制台中的 Cloud Run functions 页面:
    前往 Cloud Run functions 页面

  2. 点击要为其使用 Artifact Registry 的函数的名称。

  3. 点击修改

  4. 点击运行时、构建...以展开高级配置选项。

  5. 点击菜单栏中的安全和映像代码库以打开“安全”标签页。

  6. 映像代码库下,根据您使用的 Artifact Registry 类型,选择以下选项之一:

    • 客户管理的 Artifact Registry如果您设置了自己的 Docker 代码库,请使用此选项。
    • Google 管理的 Artifact Registry。如果您想使用 Google 管理的 Docker 代码库而不是设置您自己的 Docker 代码库,请使用此选项。
  7. 对于客户管理的 Artifact Registry,请使用 Artifact Registry 下拉菜单来选择所需的 Artifact Registry 代码库,或者您也可以按照提示创建一个新的 Artifact Registry 代码库。

  8. 点击下一步

  9. 点击部署

确定使用 Container Registry 的函数

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

gcloud

gcloud functions describe FUNCTION_NAME

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

Google Cloud 控制台

  1. 前往 Google Cloud 控制台中的 Cloud Run functions 页面:
    前往 Cloud Run functions 页面

  2. 点击要为其使用 Artifact Registry 的函数的名称。

  3. 点击详细信息

  4. 点击等效 REST 可获取完整的函数详情。

Cloud Asset Inventory

您可以使用 Cloud Asset Inventory 查询整个组织中使用 Container Registry 的函数:

  1. 如需查看您的资产,请参阅 Cloud Asset Inventory 指南。
  2. 使用以下 gcloud 命令查询使用 CONTAINER_REGISTRY 的函数。
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

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

Google Cloud 控制台

  1. 前往 Google Cloud 控制台中的 Cloud Run functions 页面:
    前往 Cloud Run functions 页面

  2. 点击要为其使用 Artifact Registry 的函数的名称。

  3. 点击修改

  4. 点击运行时、构建...以展开高级配置选项。

  5. 点击菜单栏中的安全和映像代码库以打开“安全”标签页。

  6. 映像代码库下,根据您使用的 Artifact Registry 类型,选择以下选项之一:

    • 客户管理的 Artifact Registry如果您设置了自己的 Docker 代码库,请使用此选项。
    • Google 管理的 Artifact Registry。如果您想使用 Google 管理的 Docker 代码库而不是设置您自己的 Docker 代码库,请使用此选项。
  7. 对于客户管理的 Artifact Registry,请使用 Artifact Registry 下拉菜单来选择所需的 Artifact Registry 代码库,或者您也可以按照提示创建一个新的 Artifact Registry 代码库。

  8. 点击下一步

  9. 点击部署

如需详细了解价格信息,请参阅 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。如需了解详情,请参阅在专用池中运行构建

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

gcloud

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 是您正在使用的运行时。

Google Cloud 控制台

  1. Cloud Run functions 概览页面上,选择创建函数

  2. 运行时、构建... 部分中,点击构建标签页,然后在构建工作器池文本框中输入专用池的完整资源名称。

如需了解详情,请参阅在专用池中运行构建

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

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

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

  1. 阻止使用旧版 Cloud Build 服务账号进行构建。
  2. 阻止使用默认的 Compute 服务账号进行构建。
  3. 配置一个具有适当权限范围的新服务账号,以供 build 使用。
  4. 为 build 使用已配置的服务账号。

阻止使用旧版 Cloud 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 服务账号和默认计算服务账号被禁止用于构建时,必须指定一个构建服务账号才能部署函数。

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