触发使用 Pub/Sub 消息的工作流 (gcloud CLI)

本快速入门介绍如何使用使用 Pub/Sub 接收事件的 Eventarc 触发器执行工作流。触发器通过将 Pub/Sub 传送的事件作为运行时参数传递到目标工作流来执行工作流。

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

  1. 使用 Workflows 创建和部署用于解码并返回 Pub/Sub 消息的工作流。
  2. 创建 Eventarc 触发器以将 Pub/Sub 主题连接到 Workflows 事件接收器。
  3. 向 Pub/Sub 主题发布消息以生成事件。 此事件会作为运行时参数传递到目标工作流。
  4. 在工作流执行过程中查看 Pub/Sub 消息。

准备工作

通过请求将您的项目添加到 Google Cloud 工作流的不公开预览,确保您有权访问此功能。

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

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

    • 创建 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. 安装 Google Cloud CLI。
  7. 如需初始化 gcloud CLI,请运行以下命令:

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

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

  9. 确保您的 Google Cloud 项目已启用结算功能

  10. 更新 gcloud 组件:
    gcloud components update
  11. 启用 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
  12. 设置本教程中使用的配置变量:
    export WORKFLOW_LOCATION=us-central1
    export TRIGGER_LOCATION=us-central1
    export PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    gcloud config set workflows/location ${WORKFLOW_LOCATION}
    gcloud config set eventarc/location ${TRIGGER_LOCATION}
    
  13. 如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。

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

    所需权限

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

    如需详细了解如何授予角色,请参阅管理访问权限

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

  14. 启用或使用包含 Compute Engine 的 Google Cloud 服务后,系统会自动创建 Compute Engine 默认服务账号

    为了进行测试,您可以将此服务账号附加到 Eventarc 触发器以表示该触发器的身份。请记下创建触发器时要使用的电子邮件地址格式:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

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

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

    系统会自动向 Compute Engine 服务账号授予项目的基本 Editor 角色 (roles/editor)。但是,如果自动角色授予功能已停用,请参阅适用的角色和权限说明以创建新的服务账号并为其授予所需的角色。

  15. 将项目的 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
  16. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向 Google 管理的服务账号授予 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

创建和部署工作流

创建并部署一个工作流,当发布到 Pub/Sub 主题的消息通过 HTTP 请求触发工作流时执行该工作流。

  1. 打开终端或 Cloud Shell
  2. 在您的主目录中,创建一个名为 myFirstWorkflow.yamlmyFirstWorkflow.json 的新文件。
  3. 将以下项复制并粘贴到新文件中,然后保存:

    YAML

    main:
      params: [event]
      steps:
        - decode_pubsub_message:
            assign:
               - base64: ${base64.decode(event.data.message.data)}
               - message: ${text.decode(base64)}
        - return_pubsub_message:
            return: ${message}

    JSON

    {
      "main": {
        "params": [
          "event"
        ],
        "steps": [
          {
            "decode_pubsub_message": {
              "assign": [
                {
                  "base64": "${base64.decode(event.data.message.data)}"
                },
                {
                  "message": "${text.decode(base64)}"
                }
              ]
            }
          },
          {
            "return_pubsub_message": {
              "return": "${message}"
            }
          }
        ]
      }
    }
  4. 部署工作流:
    export MY_WORKFLOW=myFirstWorkflow
    gcloud workflows deploy ${MY_WORKFLOW} --source=myFirstWorkflow.yaml
    
    如果您复制了JSON 版示例工作流,请将 .yaml 替换为 .json

创建 Eventarc 触发器

当消息发布到 Pub/Sub 主题时,该事件会触发工作流。

  1. 创建一个触发器来监听 Pub/Sub 消息:

    新建 Pub/Sub 主题

    gcloud eventarc triggers create events-pubsub-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"

    这会创建一个新的 Pub/Sub 主题和一个名为 events-pubsub-trigger 的触发器。

    现有 Pub/Sub 主题

    gcloud eventarc triggers create events-pubsub-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --transport-topic=TOPIC_ID

    TOPIC_ID 替换为现有 Pub/Sub 主题的 ID。

    这将为现有 Pub/Sub 主题创建一个名为 events-pubsub-trigger 的触发器。

    请注意,首次在 Google Cloud 项目中创建 Eventarc 触发器时,预配 Eventarc 服务代理可能会有延迟。通常,您可以尝试再次创建触发器,以解决此问题。如需了解详情,请参阅权限遭拒错误

  2. 确认触发器已成功创建:
    gcloud eventarc triggers describe events-pubsub-trigger --location=${TRIGGER_LOCATION}

    输出应类似于以下内容,其中列出了创建时间和触发器位置:

    createTime: '2021-10-14T15:15:43.872360951Z'
    [...]
    name: projects/PROJECT_ID/locations/us-central1/triggers/events-pubsub-trigger

生成并查看事件

向 Pub/Sub 主题发布消息以生成事件并触发工作流。生成的事件作为运行时参数传递到工作流,该工作流返回 Pub/Sub 消息作为工作流执行的结果。确保您传递给工作流的事件大小不超过 512 KB。

  1. 如果您为新的 Pub/Sub 主题创建了触发器,请找到创建的 Pub/Sub 主题并将其设置为环境变量:

    export TOPIC_ID=$(basename $(gcloud eventarc triggers describe events-pubsub-trigger --format='value(transport.pubsub.topic)'))
    
  2. 要触发工作流,请向 Pub/Sub 主题发送消息:

    gcloud pubsub topics publish $TOPIC_ID --message "Hello there"
    

    生成的事件将作为运行时参数传递给工作流,工作流会返回“Hello there”消息。

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

    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-09-13T19:15:10.275677049Z
    END_TIME: 2021-09-13T19:15:10.963136883Z
    NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a
    STATE: SUCCEEDED
    START_TIME: 2021-09-13T17:28:51.492864252Z
    END_TIME: 2021-09-13T17:28:52.227212414Z
    

    请注意,在上例的 NAME 字段中,a6319d9d-36a6-4117-904e-3d1118bdc90a 是工作流执行的 ID。 复制您的执行 ID 以在下一步中使用。

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

    gcloud workflows executions describe WORKFLOW_EXECUTION_ID --workflow=${MY_WORKFLOW}
    

    WORKFLOW_EXECUTION_ID 替换为与 Pub/Sub 主题发布时间对应的工作流执行 ID。输出类似于以下内容:

    argument: [...]
    endTime: '2021-09-13T17:28:47.301012152Z'
    name: projects/1234567/locations/us-central1/workflows/myFirstWorkflow/executions/f72bc6d4-5ea0-4dfb-bb14-2dae82303120
    result: 'Hello there'
    startTime: '2021-09-13T17:28:51.492864252Z'
    state: SUCCEEDED
  5. 验证发布 Pub/Sub 消息的 publish_time 以及工作流执行的 startTime 是否彼此对应。

恭喜,您已成功使用 Pub/Sub 主题生成事件,该主题使用 Eventarc 触发了 Workflows 事件接收器。

清理

  1. 删除您创建的工作流:
    gcloud workflows delete ${MY_WORKFLOW}
    当系统询问您是否要继续时,请输入 y
  2. 删除您创建的触发器:
    gcloud eventarc triggers delete events-pubsub-trigger
  3. 或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。

    删除 Google Cloud 项目:

    gcloud projects delete PROJECT_ID

后续步骤