构建 Cloud Functions 映像

概览

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

构建映像的过程完全自动执行,不需要您直接输入。但是,较旧的 Node.js 8 和 Go 1.11 运行时的进程与所有其他运行时的当前进程略有不同:Java 11、Python 3.7、Python 3.8、Node.js 10 和 Go 1.13。

Node.js 8 和 Go 1.11 运行时

对于较旧的运行时,构建流程不是在您的用户项目中进行的,而是在一个相关项目中进行的,该项目称为租户项目。在租户项目中运行构建解决了与这些运行时相关的一些问题,但同时也带来了一些新的问题:

  • 由于您的项目中不会进行构建,因此您无法访问构建日志,以排查您可能遇到的任何构建问题。

  • 此过程需要内部每日构建时间配额,在某些相当普遍的情况下,该配额可能会用尽。这可能会限制您在补充配额之前部署任何新源代码的能力。

  • 您无权访问存储函数的容器映像的 Container Registry,因此无法查看可用的映像。

较新的运行时

对于上面未提到的较新运行时(例如 Java 11+、Python 3.7+、Node.js 10+ 和 Go 1.13+),构建流程中使用的所有资源现在都会在您自己的用户项目中执行,而不是在租户项目中执行。现在,这是默认流程。

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

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

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

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

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

默认过程的特征

由于此更改,使用默认过程的所有运行时都具有以下特性:

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

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

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

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

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

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

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

访问构建映像日志

将构建映像过程纳入您的用户项目的一个主要好处是可以访问构建日志。您可以使用 gcloud CLI 或 Cloud Console 来访问日志,这些日志可通过 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.
    

Cloud Console

  1. 函数屏幕中,点击您感兴趣的函数的名称函数详细信息页面将打开。

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

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

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

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

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

使用专用池保护构建

为了允许您的函数使用依赖项(例如 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 Console

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

    Cloud Console 屏幕截图