执行 Cloud Run 作业,处理保存在 Cloud Storage 中的事件数据

您可以使用 Workflows 来执行 Cloud Run 作业,该作业可作为工作流的一部分执行更复杂的数据处理或编排现有作业的系统。

本教程演示了如何使用 Workflows 执行 Cloud Run 作业,该作业用于处理存储在 Cloud Storage 存储桶中的事件数据。将事件载荷存储在 Cloud Storage 存储桶中,可让您使用客户管理的加密密钥来加密数据,而如果您将事件数据作为环境变量传递给 Cloud Run 作业,则无法实现这一点。

下图提供了简要概览:

Pub/Sub 事件由 Eventarc 触发器路由到 Workflows,并保存在 Cloud Storage 存储桶中。Cloud Run 作业处理存储在存储桶中的事件数据。

目标

在此教程中,您将学习以下操作:

  1. 创建 Cloud Run 作业,用于处理存储在 Cloud Storage 存储桶中的事件数据。
  2. 部署执行以下操作的工作流:
    1. 接收事件作为实参。
    2. 将事件载荷数据写入 Cloud Storage 存储桶。
    3. 使用 Cloud Run Admin API 连接器执行 Cloud Run 作业。
  3. 创建一个 Pub/Sub 主题,以便您可以向其发布消息。 本教程以 Pub/Sub 事件为例,说明如何使用 Workflows 路由事件,并将事件保存到 Cloud Storage,以便 Cloud Run 作业可以处理事件数据。
  4. 创建一个 Eventarc 触发器,用于在消息写入 Pub/Sub 主题时执行工作流。
  5. 通过向 Pub/Sub 主题写入消息来触发工作流。

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

如需根据您的预计使用情况来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

准备工作

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

在开始本教程之前,您必须启用特定 API 并创建用户代管式服务账号。您必须为服务账号授予必要的角色和权限,以便您可以使用 Eventarc 触发器路由事件并执行工作流。

请注意,如果您使用 Cloud Shell 试用本教程,可能需要向 Compute Engine 默认服务账号授予其他角色。如需了解详情,请参阅本文档中的创建 Cloud Run 作业部分。

控制台

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  4. Create a service account:

    1. Ensure that you have the Create Service Accounts IAM role (roles/iam.serviceAccountCreator) and the Project IAM Admin role (roles/resourcemanager.projectIamAdmin). Learn how to grant roles.
    2. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    3. Select your project.
    4. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    5. Click Create and continue.
    6. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Storage Object Creator, Workflows Invoker.

      To grant a role, find the Select a role list, then select the role.

      To grant additional roles, click Add another role and add each additional role.

    7. Click Continue.
    8. Click Done to finish creating the service account.

  5. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向该服务代理授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。否则,系统会默认授予此角色:
    1. 在 Google Cloud 控制台中,前往 IAM 页面。

      转到 IAM

    2. 选中包括 Google 提供的角色授权复选框。
    3. 名称列中,找到 Cloud Pub/Sub 服务账号,然后点击相应行中的 修改主账号
    4. 点击添加角色添加其他角色
    5. 选择角色列表中,过滤出 Service Account Token Creator,然后选择该角色。
    6. 点击保存
  6. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  7. Cloud Shell 支持本教程中的命令行步骤。

gcloud

  1. 安装 Google Cloud CLI。

  2. 配置 gcloud CLI 以使用您的联合身份。

    如需了解详情,请参阅使用联合身份登录 gcloud CLI

  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目名称。

  5. 验证是否已为您的 Google Cloud 项目启用结算功能

  6. 启用 Artifact Registry API、Cloud Build API、Cloud Run API、Cloud Storage API、Compute Engine API、Eventarc API 和 Workflows API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com compute.googleapis.com run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com
  7. 设置身份验证:

    1. 确保您拥有 Create Service Accounts IAM 角色 (roles/iam.serviceAccountCreator) 和 Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin)。了解如何授予角色
    2. 创建服务账号:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME 替换为服务账号的名称。

    3. 向服务账号授予角色。对以下每个 IAM 角色运行以下命令一次:roles/eventarc.eventReceiver, roles/logging.logWriter, roles/run.admin, roles/storage.objectCreator, roles/workflows.invoker

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID." --role=ROLE

      请替换以下内容:

      • SERVICE_ACCOUNT_NAME:服务账号的名称
      • PROJECT_ID:您在其中创建服务账号的项目的 ID
      • ROLE:要授予的角色
  8. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向该服务代理授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。否则,系统会默认授予此角色:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub. \
        --role=roles/iam.serviceAccountTokenCreator
  9. PROJECT_NUMBER 替换为您的 Google Cloud项目编号。您可以在 Google Cloud 控制台的欢迎页面上,或通过运行以下命令来查找项目编号:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

创建 Cloud Run 作业

本教程使用您可以在 GitHub 上找到的示例代码。部署脚本会构建一个容器映像,以创建名为 message-payload-job 的 Cloud Run 作业。

该脚本还会创建一个 Cloud Storage 存储桶,并使用 uuidgen(一种通常已安装在 Linux、macOS 和 Windows 上的实用程序)为其名称生成一个通用唯一标识符 (UUID)。

Cloud Run 作业会读取 Cloud Storage 存储桶中存储的所有事件数据,然后输出这些事件数据。

  1. 如果您在 Cloud Shell 中运行部署脚本,并且 Compute Engine 默认服务账号没有 Editor 角色,请向 Compute Engine 默认服务账号授予项目中的以下角色。(否则,您可以跳过此步骤,并在下一步中继续克隆示例应用代码库。)

    1. 授予 Artifact Registry Writer 角色 (roles/artifactregistry.writer):

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@ \
          --role=roles/artifactregistry.writer

      PROJECT_NUMBER 替换为您的 Google Cloud项目编号。您可以在 Google Cloud 控制台的欢迎页面上,或通过运行以下命令来查找项目编号:

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    2. 授予 Storage Object User 角色 (roles/storage.objectUser):

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@ \
          --role=roles/storage.objectUser
    3. 授予 Logging Logs Writer 角色 (roles/logging.logWriter):

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@ \
          --role=roles/logging.logWriter
  2. 通过将示例应用代码库克隆到本地机器来获取示例代码:

    git clone https://github.com/GoogleCloudPlatform/workflows-demos.git

    或者,您也可以下载该示例的 ZIP 文件

  3. 转到包含示例代码的目录:

    cd workflows-demos/cloud-run-jobs-payload-gcs/message-payload-job
  4. 运行部署脚本,创建 Cloud Run 作业:

    ./deploy-job.sh

    输出应类似如下所示:

    STATUS: SUCCESS
    Creating input bucket message-payload-UNIQUE_ID
    ...
    Creating Cloud Run job [message-payload-job] in project [PROJECT_ID] region [us-central1]
    Creating job...
    Done.
    Job [message-payload-job] has successfully been created.
    

    记下为 Cloud Storage 存储桶名称生成的 UUID。部署工作流时,您将需要此标识符。

部署用于执行 Cloud Run 作业的工作流

定义并部署一个工作流,用于执行您刚刚创建的 Cloud Run 作业。工作流定义由一系列使用 Workflows 语法描述的步骤组成。

工作流接收事件,将事件数据保存到 Cloud Storage 存储桶,然后执行 Cloud Run 作业来处理事件数据。

控制台