在 Cloud Run 中部署函数

本页介绍了如何在 Cloud Run 中部署和修改函数。如需查看部署 Hello World 函数的示例演示,请参阅部署示例函数

在后台,Cloud Run 函数部署使用 Google Cloud 的 Buildpack 和 Cloud Build 从函数的源代码自动构建容器映像,而无需在机器上安装 Docker 或者设置 Buildpack 或 Cloud Build。

Cloud Run 函数部署还会使用 Artifact Registry 来存储工件和管理容器映像。如果您的项目尚未创建使用此名称的服务账号,Artifact Registry 会自动创建 Artifact Registry 代码库 cloud-run-source-deploy

准备工作

  1. 确保您已按照设置页面中的说明为 Cloud Run 设置了新项目。

  2. 启用 Artifact Registry API、Cloud Build API、Cloud Run Admin API 和 Cloud Logging API:

     gcloud services enable artifactregistry.googleapis.com \
         cloudbuild.googleapis.com \
         run.googleapis.com \
         logging.googleapis.com
    

    (可选)启用 Eventarc API 以使用事件触发器:

     gcloud services enable eventarc.googleapis.com
    
  3. 如果您通过网域限制组织政策来限制项目的未经身份验证的调用,则您需要按照测试专用服务中的说明访问已部署的服务。

所需的角色

如需获得从源代码部署 Cloud Run 服务所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色Cloud Run IAM 权限。如果您的 Cloud Run 服务与 Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限管理访问权限

服务账号的角色

  • 为了让 Cloud Build 能够构建来源,请运行以下命令,将 Cloud Build Service Account 角色授予给 Compute Engine 默认服务账号:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudbuild.builds.builder

    PROJECT_NUMBER 替换为您的 Google Cloud 项目编号,并将 PROJECT_ID 替换为 Google Cloud 项目 ID。 如需详细了解如何查找项目 ID 和项目编号,请参阅创建和管理项目

    向 Compute Engine 默认服务账号授予 Cloud Build Service Account 角色需要几分钟时间才能传播

  • 创建和部署函数

    您可以使用 Google Cloud 控制台或 gcloud CLI 部署函数。点击相应标签页即可获取有关所选工具的使用说明。

    控制台

    1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

      转到 Cloud Run

    2. 点击编写函数

    3. 服务名称字段中,输入一个名称以描述您的函数。服务名称只能以字母开头,最多可以包含 49 个字符(包括字母、数字或连字符)。服务名称不能以连字符结尾,并且在每个区域和项目中必须唯一。服务名称一旦指定便无法更改,并且公开显示。

    4. 区域列表中,使用默认值,或选择要在其中部署函数的区域

    5. 运行时列表中,使用默认值,或选择一个运行时版本。

    6. (可选)在触发器部分中,点击添加触发器并选择一个选项。系统会打开 Eventarc 触发器窗格,您可以在其中修改触发器的以下详细信息:

      1. 触发器名称字段中,输入触发器的名称,或使用默认名称。

      2. 从列表中选择触发器类型以指定以下触发器类型之一:

        • Google 来源,用于为 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件提供方指定触发器。

        • 自定义,用于通过应用代码生成和使用事件。按照 Eventarc 触发器窗格中的提示创建渠道。渠道是一种资源,用作将自定义事件从使用方传送到提供方的流水线。自定义事件会发布到渠道,并且 Eventarc 触发器会订阅这些事件。

        • 第三方,用于与提供 Eventarc 来源的非 Google 提供方集成。如需了解详情,请参阅 Eventarc 中的第三方事件

      3. 从列表中选择事件提供方,以选择提供用于触发函数的事件类型的产品。如需查看事件提供方列表,请参阅事件提供方和目的地

      4. 从列表中选择事件类型。触发器配置因支持的事件类型而异。如需了解详情,请参阅事件类型

      5. 区域字段中,选择 Eventarc 触发器所在的位置。一般来说,Eventarc 触发器所在的位置应与您要监控事件的 Google Cloud 资源所在的位置一致。在大多数情况下,您还应在同一区域部署函数。如需详细了解 Eventarc 触发器位置,请参阅了解 Eventarc 位置

      6. 服务账号字段中,选择一个服务账号。Eventarc 触发器与调用函数时用作身份的服务账号相关联。Eventarc 触发器的服务账号必须具有调用函数的权限。默认情况下,Cloud Run 使用 Compute Engine 默认服务账号

      7. (可选)指定要将传入请求发送到的服务网址路径。 这是触发器的事件应该发送到的目的地服务上的相对路径。例如://routerouteroute/subroute

      8. 填写必填字段后,点击保存触发器

    7. “身份验证”下,配置以下内容:

      • 如果您要创建公共 HTTP 函数(例如 webhook),请选择允许未通过身份验证的调用。选中此复选框后,系统会将 IAM Invoker 角色分配给特殊标识符 allUser。您可以在创建服务后使用 IAM 修改此设置。如果您没有选择此选项的权限(Cloud Run Admin 角色),系统会部署服务并要求进行身份验证。

      • 如果您要创建事件触发的函数,请选择需要进行身份验证

    8. (可选)更新函数的以下其他配置:

      1. 根据需要设置 CPU 分配和价格

      2. 服务自动扩缩下,根据需要指定实例数下限

      3. 根据需要设置入站流量控制设置。

      4. 展开容器、卷、网络、安全性部分,以在相应的标签页中设置其他可选设置:

    9. 点击创建,然后等待 Cloud Run 使用占位符修订版创建服务。

    10. 控制台会将您重定向到来源标签页,您可以在其中查看函数的源代码。点击保存并重新部署

    11. 来源标签页中,您可以视需要点击显示载荷,以查看传入事件的示例载荷。

    12. 部署完成后,点击测试按钮即可测试所创建的函数。

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    2. gcloud 组件更新到最新版本:

      gcloud components update
    3. 在包含示例代码的目录中运行以下命令:

      gcloud beta run deploy FUNCTION \
             --source . \
             --function FUNCTION_ENTRYPOINT \
             --base-image BASE_IMAGE \
             --region REGION
      

      您需要进行如下替换:

      • FUNCTION 替换为您要部署的函数的名称。您可以完全省略此参数,但如果省略它,系统将提示您输入名称。

      • FUNCTION_ENTRYPOINT 替换为源代码中函数的入口点。这是 Cloud Run 在您的函数运行时执行的代码。此标志的值必须是源代码中存在的函数名称或完全限定类名称。

      • BASE_IMAGE 替换为函数的基础映像环境。如需详细了解基础映像以及每个映像中包含的软件包,请参阅运行时基础映像

      • REGION 替换为您要在其中部署函数的 Google Cloud 区域。例如 us-central1

      可选:

      • 如果您要创建公开 HTTP 函数(例如 webhook),请指定 --allow-unauthenticated 标志。此标志会将 Cloud Run IAM Invoker 角色分配给特殊标识符 allUser。您可以在创建服务后使用 IAM 修改此设置。如果您要创建事件触发的函数或经过身份验证的服务,则可以省略此标志。

    您可以酌情在部署函数后向函数添加 Eventarc 触发器。如需添加触发器,请运行以下命令:

      gcloud eventarc triggers create EVENTARC_TRIGGER_NAME \
          --location=EVENTARC_TRIGGER_LOCATION \
          --destination-run-service=FUNCTION \
          --destination-run-region=REGION \
          --event-filters="type=EVENTARC_FILTER_TYPE" \
          --event-filters="EVENTARC_EVENT_FILTER" \
          --service-account=EVENTARC_TRIGGER_SERVICE_ACCOUNT
    

    您需要进行如下替换:

    • EVENTARC_TRIGGER_NAME 替换为 Eventarc 触发器的名称。

    • EVENTARC_TRIGGER_LOCATION 替换为 Eventarc 触发器的位置。一般来说,Eventarc 触发器所在的位置应与您要监控事件的 Google Cloud 资源所在的位置一致。在大多数情况下,您还应在同一区域部署函数。如需详细了解 Eventarc 触发器位置,请参阅了解 Eventarc 位置

    • FUNCTION 替换为已部署函数的名称。

    • REGION 替换为函数的 Cloud Run 区域

    • EVENTARC_FILTER_TYPE 替换为触发器监控的事件过滤条件。与所有 --event-filters 过滤条件匹配的事件会触发对函数的调用。每个触发器都必须具有格式为 --event-filters="type=EVENTARC_FILTER_TYPE" 的受支持事件类型。此事件类型创建后便无法更改。如需更改 EVENT_FILTER_TYPE,请创建一个新触发器并删除旧触发器。您可以酌情使用格式为 ATTRIBUTE=VALUE 的受支持过滤条件重复 --event-filters 标志来添加更多过滤条件。

    • EVENTARC_TRIGGER_SERVICE_ACCOUNT 替换为服务账号。Eventarc 触发器与调用函数时用作身份的服务账号相关联。Eventarc 触发器的服务账号必须具有调用函数的权限。默认情况下,Cloud Run 使用默认计算服务账号

    Terraform

    如需使用 Terraform 管理函数,您必须将函数代码构建为容器映像,然后使用 Google Cloud Platform 提供程序提供的 google_cloud_run_v2_service 资源在 Terraform 配置中定义 Cloud Run 服务。

    1. 按照构建函数中的说明创建容器映像。复制容器映像的完整路径,以便在下一步中使用 IMAGE_URL 变量。

    2. 使用以下内容创建新的 main.tf 文件:

      provider "google" {
        project = "PROJECT-ID"
      }
      
      resource "google_cloud_run_v2_service" "default" {
        name     = "SERVICE"
        location = "REGION"
        client   = "terraform"
        template {
          containers {
            image = "IMAGE_URL"
          }
        }
      }
      
      resource "google_cloud_run_v2_service_iam_member" "noauth" {
        location = google_cloud_run_v2_service.default.location
        name     = google_cloud_run_v2_service.default.name
        role     = "roles/run.invoker"
        member   = "allUsers"
      }
      

      您需要进行如下替换:

      • PROJECT-ID 替换为 Google Cloud 项目 ID。
      • REGION 替换为 Google Cloud 区域。
      • SERVICE 替换为您的 Cloud Run 服务的名称。 服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
      • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

      此配置允许公共访问(相当于 --allow-unauthenticated)。如需将该服务设为不公开,请移除 google_cloud_run_v2_service_iam_member 节。

    3. 初始化 Terraform:

      terraform init
    4. 应用 Terraform 配置:

      terraform apply

      输入 yes,确认您要应用所述操作。

    Cloud Run 位置

    Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 代管,以便在该区域内的所有可用区以冗余方式提供。

    选择用于运行 Cloud Run 服务的区域时,主要考虑该区域能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的区域,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud 产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。

    Cloud Run 可在以下区域使用:

    基于层级 1 价格

    基于层级 2 价格

    如果您已创建 Cloud Run 服务,则可以在 Google Cloud 控制台中的 Cloud Run 信息中心内查看区域。

    启用事件重试

    Eventarc 使用 Pub/Sub 作为其传输层,并且具有默认的重试政策,该政策可能不适合您的函数。

    创建 Eventarc 触发器后,我们强烈建议您更新 Eventarc 中的重试政策,并在 Pub/Sub 中配置死信主题

    修改现有函数

    您可以修改函数的配置或代码:

    修改配置

    如需修改配置参数(例如 CPU 分配、内存和 VPC 连接),请执行以下操作:

    控制台

    1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

      转到 Cloud Run

    2. 在服务列表中找到要更新的服务,然后点击以打开其详细信息。

    3. 点击修改和部署新的修订版本以显示修订版本部署表单。

    4. 修改任何配置设置。

    5. 点击部署并等待部署完成。

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    2. 如需更新一个或多个服务配置设置,请将 gcloud beta run services update SERVICE 命令与要更新的配置的命令行标志结合使用。将 SERVICE 替换为相应服务的名称。

    重新部署新的源代码

    您可以使用 Google Cloud 控制台或 gcloud CLI 修改函数的基础映像、运行时和源代码。

    点击相应标签页即可获取有关所选工具的使用说明。

    控制台

    1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

      转到 Cloud Run

    2. 服务列表中找到要更新的函数,然后点击以打开该函数的详细信息。

    3. 前往来源标签页,然后点击修改来源

    4. 点击基础映像旁边的 修改运行时和安全更新,根据需要从列表中选择其他运行时环境,然后点击保存

    5. 根据需要修改函数入口点

    6. 文件部分中,选择 添加文件以创建新文件,选择 重命名文件以重命名文件,或者选择 删除文件以删除文件。

    7. 代码部分中,根据需要修改源代码。

    8. 点击保存并重新部署,然后等待部署完成。

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    2. 在包含函数源代码的目录中运行以下命令:

      gcloud beta run deploy FUNCTION \
             --source . \
             --function FUNCTION_ENTRYPOINT \
             --base-image BASE_IMAGE \
             --region REGION
      

      您需要进行如下替换:

      • FUNCTION 替换为您要修改的函数的名称。

      • FUNCTION_ENTRYPOINT 替换为源代码中函数的入口点。

      • BASE_IMAGE 替换为函数的基础映像环境。在大多数情况下,您可以指定运行时 ID,例如 nodejs22

        或者,如果您想在堆栈中使用特定的系统软件包或指定基础映像的下载区域,可以指定以下其中一项:

        • 完整的基础映像路径,例如 us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/nodejs22。通过此选项,您可以指定基础映像、堆栈中的特定系统软件包以及基础映像的下载区域。
        • 完整基础映像路径的别名,例如 google-22/nodejs22google-22-full/nodejs22。通过这个更短的别名选项,您可以指定堆栈中的基础映像和特定系统软件包。

        如需详细了解基础映像以及每个映像中包含的软件包,请参阅运行时基础映像

      • REGION 替换为您要在其中部署函数的 Google Cloud 区域。例如 us-central1

      可选标志

      您可以在修改函数时配置以下可选标志:

      • 构建环境变量标志,用于在构建步骤期间指定环境变量,例如配置构建时专用证书或参数。

      • 工作器池标志,用于指定要在 VPC Service Controls 安全的构建上下文中使用哪个工作器池。

      • 自定义构建服务账号标志,用于指定默认构建服务账号的替代方案,以提高安全性。

      • 自动基础映像更新标志,用于停用自动更新。默认情况下,函数会启用自动安全更新。

    后续步骤

    部署新函数后,您可以执行以下操作: