触发使用 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. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. 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.

  9. Make sure that billing is enabled for your Google Cloud project.

  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 默认服务账号,因为您将把它附加到 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 角色,这些角色包含所需的最小权限并遵循最小权限原则。

  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 推送请求,请向该服务代理授予 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 项目后,系统会停止对该项目中使用的所有资源计费。

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

后续步骤