构建 Cloud Functions 映像

概览

将函数的源代码部署到 Cloud Functions 时,该源代码存储在 Cloud Storage 存储分区中。然后,Cloud Build 会自动将您的代码构建到容器映像中,并将该映像推送到映像注册表(Container Registry 或 Artifact Registry)。当需要运行容器来执行函数时,Cloud Functions 会访问此映像。

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

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

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

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

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

  • 由于 Cloud Storage 会直接在您的项目中使用,因此函数的源代码目录会显示在名为 gcf-sources-PROJECT_NUMBER-REGION 的存储分区中。

构建流程的特征

构建流程具有以下特征:

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

    如需手动启用 API,请点击上面的链接,从下拉菜单中选择您的项目,然后点击继续

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

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

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

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

    • 如需了解 Artifact 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. 函数屏幕中,点击您感兴趣的函数的名称函数详细信息页面将打开。

  2. 向下滚动,直到您看到容器构建部分。如果您的构建没有错误,您会看到一个链接,点击后可以显示构建日志。如果您的构建有错误,如下所示,容器构建部分将以内嵌方式显示它们;点击了解详情可以直接显示构建日志。

    显示“容器构建”部分的输出的屏幕截图

  3. 日志查看器屏幕会打开。点击您感兴趣的条目。

  4. 完整的构建日志条目会打开,其中显示受影响的文件、有关错误的说明(在本例中,pom.xml 中缺少括号),以及错误的行和列。

    显示构建日志条目的屏幕截图

映像注册表选项

Cloud Functions(第 2 代)仅使用 Artifact Registry 来存储根据函数源代码构建的映像。映像存储在名为 REGION-docker.pkg.dev/PROJECT_ID/gcf-artifacts 的代码库中。

Cloud Functions(第 1 代)默认使用 Container Registry,但您也可以使用 Artifact Registry。在 Cloud Functions(第 1 代)中,您可以按如下方式创建或更新基于 Artifact Registry 的函数:

控制台

  1. 转到 Google Cloud Console 中的 Cloud Functions 页面:
    转到 Cloud 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. 点击部署

gcloud

对于客户管理的 Artifact Registry,请运行以下命令:

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

替换以下内容:

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

对于 Google 管理的 Artifact Registry,请使用以下命令:

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

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

使用专用池保护构建

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

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

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

  3. 如果专用工作器池与函数不在同一个项目中,则需要向 Cloud 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 是您正在使用的运行时。

    Cloud 控制台

    Create function 页面的 Runtime, build and connections settings 部分中,选择 Build 标签页,然后在 Build worker pools Selected environment 文本框中输入 PRIVATE_POOL_NAME,其中 PRIVATE_POOL_NAME 是池的名称。

    Cloud Console 屏幕截图