构建流程概览

将函数的源代码部署到 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 函数使用 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 配置:

  • 确保构建服务账号可以访问 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. 点击部署

改用 Artifact Registry

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

gcloud

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

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

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

禁止使用旧版 Cloud Build 服务账号进行构建

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

PROJECT_NUMBER@cloudbuild.gserviceaccount.com

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

阻止使用默认的计算服务账号进行构建

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

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

在部署函数时,可以指定 build 服务账号作为函数配置的一部分。当旧版 Cloud Build 服务账号和默认的 Compute Engine 服务账号无法用于构建时,必须指定 build 服务账号才能部署函数。

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