触发从 Cloud Storage 接收直接事件的工作流 (gcloud CLI)

本快速入门介绍如何使用从 Cloud Storage 接收 事件的 Eventarc 触发器执行工作流。

触发器通过侦听 Cloud Storage 存储桶中的对象创建事件来执行工作流,并将事件作为运行时参数传递给目标工作流。

在本快速入门中,您将执行以下操作:

  1. 创建 Cloud Storage 存储桶作为事件来源。

  2. 使用 Workflows 创建和部署工作流,用于提取并返回存储桶的名称和上传文件的名称。

  3. 创建一个将 Cloud Storage 存储桶连接到 Workflows 事件接收器的 Eventarc 触发器。

  4. 通过将文本文件上传到 Cloud Storage 存储桶来生成事件。此事件会作为运行时参数传递到目标工作流。

  5. 在执行工作流后,查看存储桶的名称和文本文件的名称。


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示:

操作演示


准备工作

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

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud新手, 请创建一个账号来评估我们的产品在 实际场景中的表现。新客户还可获享 $300 赠金,用于 运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。

  3. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

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

    gcloud init
  5. 创建或选择 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 项目名称。

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

  7. 安装 Google Cloud CLI。

  8. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

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

    gcloud init
  10. 创建或选择 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 项目名称。

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

  12. 启用 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

  13. 更新 gcloud 组件:
    gcloud components update
  14. 使用您的账号登录:
    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。

设置服务账号

向本快速入门中使用的服务账号授予所需的权限。

  1. 如果您是项目创建者,则会被授予 基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色 可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。

    如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。

    所需权限

    如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  2. 记下 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 角色,这些角色包含所需的最小权限并遵循最小权限原则。

  3. 将项目的 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
  4. 将项目的 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
  5. 将项目的 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
  6. 在为来自 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'
  7. 如果您在 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 存储桶以用作事件来源:

  gcloud storage buckets create gs://${PROJECT_ID}-bucket --location=us-central1

创建和部署工作流

创建和部署在 Cloud Storage 存储桶中创建的对象使用 HTTP 请求触发工作流时执行的工作流。

  1. 在您的主目录中,创建一个名为 myEventWorkflow.yamlmyEventWorkflow.json 的新文件。

  2. 将以下项复制并粘贴到新文件中,然后保存:

    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}"
          }
        }
      }
    ]
    }
    }
  3. 部署工作流:

    export MY_WORKFLOW=myEventWorkflow
    gcloud workflows deploy ${MY_WORKFLOW} --source=myEventWorkflow.yaml
    

    如果您复制了JSON 版示例工作流,请将 .yaml 替换为 .json

创建 Eventarc 触发器

Eventarc 触发器会将 Cloud Storage 存储桶中的事件发送到 Workflows 目的地。

  1. 创建一个过滤 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 服务代理可能会有延迟。通常,您可以尝试再次创建触发器,以解决此问题。如需了解详情,请参阅 权限遭拒错误

  2. 如需确认 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
    

生成并查看事件

  1. 如需生成事件,请将一个文本文件上传到 Cloud Storage:

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://${PROJECT_ID}-bucket/random.txt
    

    上传会生成一个事件,该事件作为运行时参数传递给工作流,而该工作流返回存储桶和上传文件的名称。

  2. 如需验证工作流执行是否已触发,请列出最后五项执行:

    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,因为下一步会用到。

  3. 如需查看执行状态,请运行以下命令:

    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
    
  4. 验证 Cloud Storage 存储桶的更新时间 "timeCreated": "2021-10-13T03:38" 以及工作流执行的 startTime 是否彼此对应。

恭喜,您已成功生成一个 Cloud Storage 事件,该事件使用 Eventarc 触发了 Workflows 事件接收器。

清理

为避免因本页面中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的 Google Cloud 项目。

  1. 删除您创建的工作流:

    gcloud workflows delete ${MY_WORKFLOW}
    

    当系统询问您是否要继续时,请输入 y

  2. 删除存储桶:

    gcloud storage rm gs://${PROJECT_ID}-bucket/ --recursive
    
  3. 删除在本教程中创建的触发器:

    gcloud eventarc triggers delete storage-events-trigger
    
  4. 或者,您也可以删除项目,以避免产生费用。 Google Cloud 删除 Google Cloud 项目后,系统即会停止对该项目中使用的所有 资源计费。

    删除项目: Google Cloud

    gcloud projects delete PROJECT_ID

后续步骤