触发从 Cloud Storage 接收直接事件的工作流 (gcloud CLI)
本快速入门介绍如何使用从 Cloud Storage 接收事件的 Eventarc 触发器执行工作流。
触发器通过侦听 Cloud Storage 存储桶中的对象创建事件来执行工作流,并将事件作为运行时参数传递给目标工作流。
在本快速入门中,您将执行以下操作:
创建 Cloud Storage 存储桶作为事件来源。
使用 Workflows 创建和部署工作流,用于提取并返回存储桶的名称和上传文件的名称。
创建一个将 Cloud Storage 存储桶连接到 Workflows 事件接收器的 Eventarc 触发器。
通过将文本文件上传到 Cloud Storage 存储桶来生成事件。此事件会作为运行时参数传递到目标工作流。
在执行工作流后,查看存储桶的名称和文本文件的名称。
如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示:
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
- 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.
- 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.
启用 Compute Engine、Eventarc、Pub/Sub 和 Workflows API。
gcloud services enable \ compute.googleapis.com \ eventarc.googleapis.com \ pubsub.googleapis.com \ workflows.googleapis.com \ workflowexecutions.googleapis.com
- 更新
gcloud
组件:gcloud components update
- 使用您的账号登录:
gcloud auth login
设置环境变量
设置本快速入门中使用的环境变量:
export PROJECT_ID=PROJECT_ID
export WORKFLOW_LOCATION=us-central1
export TRIGGER_LOCATION=us-central1
gcloud config set project ${PROJECT_ID}
gcloud config set workflows/location ${WORKFLOW_LOCATION}
gcloud config set eventarc/location ${TRIGGER_LOCATION}
您可以在 Google Cloud 控制台的欢迎页面上找到项目 ID。
设置服务账号
向本快速入门中使用的服务账号授予所需的权限。
-
如果您是项目创建者,则会被授予基本 Owner 角色 (
roles/owner
)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。
所需权限
如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Eventarc Admin (
roles/eventarc.admin
) -
Logs View Accessor (
roles/logging.viewAccessor
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Service Account Admin (
roles/iam.serviceAccountAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Admin (
roles/serviceusage.serviceUsageAdmin
) -
Storage Admin (
roles/storage.admin
) -
Workflows Admin (
roles/workflows.admin
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
Eventarc Admin (
记下 Compute Engine 默认服务账号,因为您将把它附加到 Eventarc 触发器以代表触发器的身份信息进行测试。启用或使用包含 Compute Engine 的 Google Cloud 服务后,系统会自动创建此服务账号,其电子邮件地址格式如下:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
将
PROJECT_NUMBER
替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
对于生产环境,我们强烈建议创建新的服务账号,并为其授予一个或多个 IAM 角色,这些角色包含所需的最小权限并遵循最小权限原则。
- 将项目的 Eventarc Event Receiver 角色 (
roles/eventarc.eventReceiver
) 授予 Compute Engine 默认服务账号,以便 Eventarc 触发器可以接收来自事件提供程序的事件。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
- 将项目的 Workflows Invoker 角色 (
roles/workflows.invoker
) 授予 Compute Engine 默认服务账号,以便该账号有权触发您的工作流执行。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/workflows.invoker
- 将项目的 Logging Logs Writer 角色 (
roles/logging.logWriter
) 授予 Compute Engine 默认服务账号,以便工作流可以将日志发送到 Cloud 日志记录。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter
- 在为来自 Cloud Storage 的直接事件创建触发器之前,请向 Cloud Storage 服务代理授予 Pub/Sub Publisher 角色 (
roles/pubsub.publisher
):SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role='roles/pubsub.publisher'
- 如果您在 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
创建 Cloud Storage 存储桶
创建 Cloud Storage 存储桶以用作事件来源:
gsutil mb -l us-central1 gs://${PROJECT_ID}-bucket/
创建和部署工作流
创建和部署在 Cloud Storage 存储桶中创建的对象使用 HTTP 请求触发工作流时执行的工作流。
在您的主目录中,创建一个名为
myEventWorkflow.yaml
或myEventWorkflow.json
的新文件。将以下项复制并粘贴到新文件中,然后保存:
YAML
main: params: [event] steps: - log_event: call: sys.log args: text: ${event} severity: INFO - extract_bucket_object: assign: - bucket: ${event.data.bucket} - object: ${event.data.name} - return_bucket_object: return: bucket: ${bucket} object: ${object}
JSON
{ "main": { "params": [ "event" ], "steps": [ { "log_event": { "call": "sys.log", "args": { "text": "${event}", "severity": "INFO" } } }, { "extract_bucket_object": { "assign": [ { "bucket": "${event.data.bucket}" }, { "object": "${event.data.name}" } ] } }, { "return_bucket_object": { "return": { "bucket": "${bucket}", "object": "${object}" } } } ] } }
部署工作流:
export MY_WORKFLOW=myEventWorkflow gcloud workflows deploy ${MY_WORKFLOW} --source=myEventWorkflow.yaml
如果您复制了JSON 版示例工作流,请将
.yaml
替换为.json
。
创建 Eventarc 触发器
Eventarc 触发器会将 Cloud Storage 存储桶中的事件发送到 Workflows 目的地。
创建一个过滤 Cloud Storage 事件的触发器:
gcloud eventarc triggers create storage-events-trigger \ --destination-workflow=${MY_WORKFLOW} \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=${PROJECT_ID}-bucket" \ --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
这将创建一个名为
storage-events-trigger
的触发器。请注意,首次在 Google Cloud 项目中创建 Eventarc 触发器时,预配 Eventarc 服务代理可能会有延迟。通常,您可以尝试再次创建触发器,以解决此问题。如需了解详情,请参阅权限遭拒错误。
如需确认
storage-events-trigger
已成功创建,请运行以下命令:gcloud eventarc triggers describe storage-events-trigger --location=${TRIGGER_LOCATION}
输出应类似于以下内容,其中列出了创建时间和触发器位置:
createTime: '2021-10-14T15:15:43.872360951Z' [...] name: projects/PROJECT_ID/locations/us-central1/triggers/storage-events-trigger
生成并查看事件
如需生成事件,请将一个文本文件上传到 Cloud Storage:
echo "Hello World" > random.txt gsutil cp random.txt gs://${PROJECT_ID}-bucket/random.txt
上传会生成一个事件,该事件作为运行时参数传递给工作流,而该工作流返回存储桶和上传文件的名称。
如需验证工作流执行是否已触发,请列出最后五项执行:
gcloud workflows executions list ${MY_WORKFLOW} --limit=5
输出应类似于以下内容,其中列出了每项工作流执行的 NAME 和 STATE (
SUCCEEDED
):NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/8c02b8f1-8836-4a6d-99d9-fc321eb9668f STATE: SUCCEEDED START_TIME: 2021-10-13T03:38:03.019148617Z END_TIME: 2021-10-13T03:38:03.249705805Z NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a STATE: SUCCEEDED START_TIME: 2021-10-13T17:28:51.492864252Z END_TIME: 2021-10-13T17:28:52.227212414Z
请注意,在上例的
NAME
字段中,a6319d9d-36a6-4117-904e-3d1118bdc90a
是工作流执行的 ID。 复制执行 ID,因为下一步会用到。如需查看执行状态,请运行以下命令:
gcloud workflows executions describe WORKFLOW_EXECUTION_ID --workflow=${MY_WORKFLOW}
将
WORKFLOW_EXECUTION_ID
替换为与文件上传到存储桶的时间对应的工作流执行 ID。输出类似于以下内容:
argument: [...] name: projects/218898424763/locations/us-central1/workflows/myEventWorkflow/executions/86d2567b-0f1e-49b3-8b10-cdac5d0f6239 result: '{"bucket":"PROJECT_ID-bucket","object":"random.txt"}' startTime: '2021-10-13T03:38:03.019148617Z' state: SUCCEEDED
验证 Cloud Storage 存储桶的更新时间
"timeCreated": "2021-10-13T03:38"
以及工作流执行的startTime
是否彼此对应。
恭喜,您已成功生成一个 Cloud Storage 事件,该事件使用 Eventarc 触发了 Workflows 事件接收器。
清理
为避免因本页面中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的 Google Cloud 项目。
删除您创建的工作流:
gcloud workflows delete ${MY_WORKFLOW}
当系统询问您是否要继续时,请输入
y
。删除存储桶:
gsutil rm -r gs://${PROJECT_ID}-bucket/
删除在本教程中创建的触发器:
gcloud eventarc triggers delete storage-events-trigger
或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID