您可以使用工作流在执行更复杂的数据处理或编排现有作业的系统的工作流中执行 Cloud Run 作业。
本教程演示了如何使用工作流来执行 Cloud Run 作业,以处理存储在 Cloud Storage 存储桶中的事件数据。将事件载荷存储在 Cloud Storage 存储桶中后,您可以使用客户管理的加密密钥来加密数据,而如果您将事件数据作为环境变量传递给 Cloud Run 作业,则无法执行此操作。
下图提供了简要概览:
目标
在此教程中,您将学习以下操作:
- 创建 Cloud Run 作业来处理存储在 Cloud Storage 存储桶
- 部署执行以下操作的工作流:
- 接收事件作为参数。
- 将事件载荷数据写入 Cloud Storage 存储桶。
- 使用 Cloud Run Admin API 连接器执行 Cloud Run 作业。
- 创建一个 Pub/Sub 主题,以便向其发布消息。 本教程使用 Pub/Sub 事件作为示例来介绍如何 将事件保存到 Cloud Storage,以便 Cloud Run 作业可以处理 事件数据。
- 创建一个 Eventarc 触发器,用于在以下情况下执行工作流: 该消息会写入 Pub/Sub 主题
- 向 Pub/Sub 主题写入消息以触发工作流。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
在开始本教程之前,您必须启用特定 API 并创建用户管理的服务账号。您必须向服务账号授予必要的角色和权限,才能使用 Eventarc 触发器路由事件并执行工作流。
请注意,如果您使用 Cloud Shell 来试用本教程 需要向 Compute Engine 默认服务授予额外的角色 。如需了解详情,请参阅本文档中的创建 Cloud Run 作业部分。
控制台
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs.
-
Create a service account:
-
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
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
. - Click Create and continue.
-
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. - Click Continue.
-
Click Done to finish creating the service account.
-
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs.
-
Create a service account:
-
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
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
. - Click Create and continue.
-
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. - Click Continue.
-
Click Done to finish creating the service account.
-
- 如果您在 2021 年 4 月 8 日当天或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向该服务代理授予 Service Account Token Creator 角色 (
roles/iam.serviceAccountTokenCreator
)。否则,系统会默认授予此角色:- 在 Google Cloud 控制台中,前往
IAM 页面。
- 选中包括 Google 提供的角色授权复选框。
- 在名称列中,找到 Cloud Pub/Sub 服务账号 然后点击 修改 主账号。
- 点击 添加角色或 添加其他角色。
- 在选择角色列表中,过滤出 Service Account Token Creator,然后选择该角色。
- 点击保存。
- 在 Google Cloud 控制台中,前往
IAM 页面。
-
In the Google Cloud console, 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.
Cloud Shell 支持本教程中的命令行步骤。
gcloud
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
Set up authentication:
-
Create the service account:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Replace
SERVICE_ACCOUNT_NAME
with a name for the service account. -
Grant roles to the service account. Run the following command once for each of the following IAM roles:
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.iam.gserviceaccount.com" --role=ROLE
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service accountPROJECT_ID
: the project ID where you created the service accountROLE
: the role to grant
-
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
Set up authentication:
-
Create the service account:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Replace
SERVICE_ACCOUNT_NAME
with a name for the service account. -
Grant roles to the service account. Run the following command once for each of the following IAM roles:
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.iam.gserviceaccount.com" --role=ROLE
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service accountPROJECT_ID
: the project ID where you created the service accountROLE
: the role to grant
-
- 如果您在 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.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
将 PROJECT_NUMBER
替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:
gcloud projects describe PROJECT_ID --format='value(projectNumber)'
创建 Cloud Run 作业
本教程使用的示例代码可在 GitHub 上找到。Deployment 脚本构建容器映像,以创建 Cloud Run 作业。该脚本还会创建一个 Cloud Storage 存储桶。Cloud Run 作业会读取存储在 Cloud Storage 存储桶中的所有事件数据,然后输出事件数据。
如果您在 Cloud Shell 中运行部署脚本,并且 Compute Engine 默认服务账号 没有 Editor 角色,请将项目的以下角色授予 Compute Engine 默认服务账号。(您也可以跳过 并继续在下一步中克隆示例应用代码库。)
授予 Artifact Registry Writer 角色 (
roles/artifactregistry.writer
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.writer
将
PROJECT_NUMBER
替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
授予 Storage Object User 角色 (
roles/storage.objectUser
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/storage.objectUser
授予 Logging Logs Writer 角色 (
roles/logging.logWriter
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter
通过将示例应用代码库克隆到本地来获取示例代码 机器:
git clone https://github.com/GoogleCloudPlatform/workflows-demos.git
或者,您也可以 将示例下载为 ZIP 文件
转到包含示例代码的目录:
cd workflows-demos/cloud-run-jobs-payload-gcs/message-payload-job
通过运行部署脚本创建 Cloud Run 作业:
./deploy-job.sh
该脚本会创建一个名为 message-payload-PROJECT_ID
的 Cloud Storage 存储桶,其中 PROJECT_ID
是您的 Google Cloud 项目的 ID。系统还会创建一个名为 message-payload-job
的 Cloud Run 作业。
部署执行 Cloud Run 作业的工作流
定义并部署一个工作流,用于执行您刚刚创建的 Cloud Run 作业。工作流程定义由一系列步骤组成 使用 Workflows 语法描述。
该工作流会接收事件,将事件数据保存到 Cloud Storage 存储桶,然后执行 Cloud Run 作业来处理事件数据。
控制台
在 Google Cloud 控制台中,前往 工作流程页面:
点击
创建。输入新工作流的名称,例如
message-payload-workflow
。选择适当的区域;例如
us-central1
。在服务账号字段中,选择您之前创建的服务账号。
服务账号将用作工作流的身份。您应该已向服务账号授予以下角色:
- Cloud Run Admin:用于执行 Cloud Run 作业
- Logs Writer:用于写入日志条目
- Storage Object Creator:用于在 Cloud Storage 中创建对象
点击下一步。
在工作流编辑器中,为 工作流:
点击部署。
gcloud
为您的工作流创建源代码文件:
touch message-payload-workflow.yaml
将以下工作流定义复制到
message-payload-workflow.yaml
:输入以下命令以部署工作流:
gcloud workflows deploy message-payload-workflow \ --location=us-central1 \ --source=message-payload-workflow.yaml \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
替换以下内容:
SERVICE_ACCOUNT_NAME
:您之前创建的服务账号的名称PROJECT_ID
:您的 Google Cloud 项目
服务账号充当工作流的身份。您应该有 已向该服务账号授予以下角色:
roles/logging.logWriter
:用于写入日志条目roles/run.admin
:用于执行 Cloud Run 作业roles/storage.objectCreator
:用于在 Cloud Storage 中创建对象
该工作流会执行以下操作:
init
步骤 - 接受事件作为参数,并设置必要的变量。log_event
步骤 - 使用函数在 Cloud Logging 中创建日志条目。 sys.log.write_payload_to_gcs
步骤 - 发出 HTTPPOST
请求并写入事件 Cloud Storage 存储桶文件。run_job_to_process_payload
步骤 - 使用 Cloud Run Admin API 连接器方法googleapis.run.v1.namespaces.jobs.run
来执行作业。Cloud Storage 存储桶和数据文件名 作为替换变量从工作流传递到作业。finish
步骤 - 返回有关作业执行的信息(作为 工作流。
创建 Pub/Sub 主题
创建一个 Pub/Sub 主题,以便向其发布消息。 Pub/Sub 事件用于演示如何路由事件 并将事件保存到 Cloud Storage 以便 Cloud Run 作业能够处理事件数据。
控制台
在 Google Cloud 控制台中,前往主题页面。
点击
创建主题。在主题 ID 字段中,输入主题的 ID,例如
message-payload-topic
。保留添加默认订阅选项。
请勿选择其他选项。
点击创建。
gcloud
如需创建 ID 为 message-payload-topic
的主题,请运行 gcloud pubsub topics create
命令:
gcloud pubsub topics create message-payload-topic
创建 Eventarc 触发器以将事件路由到工作流
自动执行工作流,进而执行 Cloud Run 创建一个用于响应 Pub/Sub 事件,用于将事件路由到工作流。 每当有消息写入 Pub/Sub 主题时,该事件都会触发工作流的执行。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面:
点击工作流的名称,例如
message-payload-workflow
。在工作流详情页面上,点击
修改。在修改工作流页面的触发器部分, 点击添加新触发器 >Eventarc。
系统随即会打开 Eventarc 触发器窗格。
在触发器名称字段中,输入触发器的名称,例如
message-payload-trigger
。在事件提供方列表中,选择 Cloud Pub/Sub。
在事件列表中,选择 google.cloud.pubsub.topic.v1.messagePublished。
从选择 Cloud Pub/Sub 主题列表中,选择您之前创建的 Pub/Sub 主题。
在服务账号字段中,选择您之前创建的服务账号。
服务账号充当触发器的身份。您应该有 已向该服务账号授予以下角色:
- Eventarc Event Receiver:用于接收事件
- Workflows Invoker:用于执行工作流
点击保存触发器。
Eventarc 触发器现在显示在触发器中 部分(位于修改工作流程页面上)。
点击下一步。
点击部署。
gcloud
运行以下命令以创建 Eventarc 触发器:
gcloud eventarc triggers create message-payload-trigger \ --location=us-central1 \ --destination-workflow=message-payload-workflow \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/PROJECT_ID/topics/message-payload-topic \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目的 IDSERVICE_ACCOUNT_NAME
:服务的名称 您之前创建的 Google Ads 账号。
该服务账号充当触发器的身份。您应该有 已向该服务账号授予以下角色:
roles/eventarc.eventReceiver
:用于接收事件roles/workflows.invoker
:用于执行工作流
触发工作流
通过向 Pub/Sub 发布消息来测试端到端系统 主题并生成事件。如需了解详情,请参阅 使用事件或 Pub/Sub 消息触发工作流。
向 Pub/Sub 主题发布消息以生成事件:
gcloud pubsub topics publish message-payload-topic --message="Hello World"
系统将事件传送到工作流程,该工作流程会记录事件消息, 事件数据传输到 Cloud Storage 存储桶,并执行 Cloud Run 作业,用于处理 Cloud Storage此过程可能需要一分钟时间。
查看 作业执行:
gcloud run jobs executions list --job=message-payload-job
您应该会在输出中看到新的作业执行。
如需查看触发工作流程时创建的与事件相关的日志条目,请运行以下命令:
gcloud logging read "resource.type=cloud_run_job AND textPayload:Payload"
查找类似如下的日志条目:
textPayload: "Payload: {'message': {'data': 'SGVsbG8gV29ybGQ=', 'messageId': '8834108235224238',\ \ 'publishTime': '2023-09-20T17:07:52.921Z'}, 'subscription': 'projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741'}" ... resource: labels: job_name: message-payload-job location: us-central1 project_id: MY_PROJECT type: cloud_run_job textPayload: Processing message payload gs://message-payload-MY_PROJECT/8254002311197919.data.json
您可以通过在以下位置查看事件数据来确认结果符合预期: Cloud Storage 存储桶对象。
检索您的存储桶名称:
gcloud storage ls
输出类似于以下内容:
gs://message-payload-PROJECT_ID/
列出存储桶中的对象:
gcloud storage ls gs://message-payload-PROJECT_ID/** --recursive
输出应类似如下所示:
gs://message-payload-PROJECT_ID/OBJECT_ID.data.json
请记下要在下一步中使用的
OBJECT_ID
。将存储桶中的对象下载为文件:
gcloud storage cp gs://message-payload-PROJECT_ID/OBJECT_ID.data.json message-event.txt
将
OBJECT_ID
替换为 上一步。在文本编辑器中,打开
message-event.txt
文件。事件正文 文件应类似于以下内容:{ "message": { "data": "SGVsbG8gV29ybGQ=", "messageId": "8254002311197919", "publishTime": "2023-09-20T16:54:29.312Z" }, "subscription": "projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741" }
请注意,如果您将
SGVsbG8gV29ybGQ=
的数据值从其 Base64 格式,“Hello World”。
清理
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除教程资源
删除您在本教程中创建的资源: