使用 Cloud Scheduler 安排工作流

本教程介绍如何使用 Cloud Scheduler 自动执行工作流,以便工作流按特定时间表运行,在本例中,每 5 分钟运行一次。

目标

  1. 创建和部署可以接收运行时参数的工作流。
  2. 创建 Cloud Scheduler 作业,以便触发工作流并每 5 分钟执行一次该作业,并以正确的格式传入 JSON 参数。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 为 Cloud Scheduler 设置环境,包括创建 App Engine 应用。
  2. 启用 Workflows API。

    启用 API

  3. 设置本教程中使用的默认位置:
      gcloud config set workflows/location REGION
    REGION 替换为您选择的受支持的 Workflows 位置
  4. 创建服务帐号以供 Workflows 使用;例如 sa-name
      gcloud iam service-accounts create sa-name
  5. 向您的服务帐号授予 workflows.invoker 角色,以便该帐号有权触发您的工作流:
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:sa-name@PROJECT_ID.iam.gserviceaccount.com" \
          --role "roles/workflows.invoker"
  6. PROJECT_ID 替换为您的 Google Cloud 项目 ID。
  7. logging.logWriter 角色授予服务帐号。
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:sa-name@PROJECT_ID.iam.gserviceaccount.com" \
          --role "roles/logging.logWriter"

创建接收运行时参数的工作流

工作流定义由一系列使用 Workflows 语法描述的步骤组成,该语法可以采用 YAML 或 JSON 格式编写。创建工作流后,可以进行部署,使其可以执行。

控制台

  1. 在 Cloud Console 中,转到 Workflows 页面。

    转到 Workflows

  2. 点击创建

  3. 输入 myFirstWorkflow 作为新工作流的名称。

  4. 选择 us-central1 作为区域。

  5. 选择您之前创建的服务帐号。

  6. 点击下一步

  7. 在工作流编辑器中,输入工作流的定义。

    YAML

    main:
      params: [args]
      steps:
        - step1:
            assign:
              - outputVar: ${"Hello, " + args.firstName + " " + args.lastName + "!"}
        - step2:
            return: ${outputVar}
    

    JSON

    {
      "main": {
        "params": [
          "args"
        ],
        "steps": [
          {
            "step1": {
              "assign": [
                {
                  "outputVar": "${\"Hello \" + args.firstName + \" \" + args.lastName}"
                }
              ]
            }
          },
          {
            "step2": {
              "return": "${outputVar}"
            }
          }
        ]
      }
    }
      

    此工作流向以其运行时参数形式传递其名字和姓氏的用户返回“Hello”问候语。

  8. 点击部署

gcloud

  1. 打开终端。
  2. 将以下工作流定义保存为 YAML 或 JSON 文件,例如 myFirstWorkflow.yamlmyFirstWorkflow.json

    YAML

    main:
      params: [args]
      steps:
        - step1:
            assign:
              - outputVar: ${"Hello, " + args.firstName + " " + args.lastName + "!"}
        - step2:
            return: ${outputVar}
    

    JSON

    {
      "main": {
        "params": [
          "args"
        ],
        "steps": [
          {
            "step1": {
              "assign": [
                {
                  "outputVar": "${\"Hello \" + args.firstName + \" \" + args.lastName}"
                }
              ]
            }
          },
          {
            "step2": {
              "return": "${outputVar}"
            }
          }
        ]
      }
    }
      

    此工作流向以其运行时参数形式传递其名字和姓氏的用户返回“Hello”问候语。

  3. 输入以下命令以部署工作流:

    gcloud workflows deploy myFirstWorkflow \
        --source=myFirstWorkflow.yaml_OR_json \
        --service-account=sa-name@PROJECT_ID.iam.gserviceaccount.com

    yaml_OR_json 替换为 yamljson,具体取决于您之前创建的 Workflows 定义文件的格式。

安排工作流

通过使用先前创建的服务帐号创建 Cloud Scheduler 作业,以触发工作流。

控制台

  1. 在 Cloud Console 中,转到 Cloud Scheduler 页面:

    转到 Cloud Scheduler

  2. 点击创建作业

  3. 名称设置为 my-workflow-job

  4. 对于频率,输入:

    */5 * * * *
    这将每 5 分钟执行一次作业。该间隔使用 unix-cron 格式定义。

  5. 对于时区,请选择国家/地区和时区。

    例如,选择美国和洛杉矶或太平洋夏令时 (PDT)

  6. 点击继续

  7. 对于目标类型,选择 HTTP

  8. 对于网址,请输入:

    https://workflowexecutions.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/workflows/myFirstWorkflow/executions
    

  9. HTTP 方法保留为 POST 的默认值。

  10. 添加以下两个 HTTP 标头

    • 名称:Content-Type,值:application/octet-stream
    • 名称:User-Agent,值:Google-Cloud-Scheduler
  11. 对于正文,请输入:

    {"argument": "{\"firstName\":\"Sherlock\", \"lastName\":\"Holmes\"}"}
    

    这将传递工作流参数的 JSON 编码;在此示例中,名字为“Sherlock”和姓氏“Holmes”。字符串中的双引号使用反斜杠 (\) 进行转义。

  12. 身份验证标头部分,选择添加 OAuth 令牌

  13. 输入您之前创建的服务帐号。

    sa-name@PROJECT_ID.iam.gserviceaccount.com
    
    您不必指定范围,因为系统将使用 https://www.googleapis.com/auth/cloud-platform 的默认值。

  14. 接受所有其他默认设置,然后点击创建

gcloud

输入以下命令以安排名为 my-workflow-job 的作业:

gcloud scheduler jobs create http my-workflow-job \
    --schedule="*/5 * * * *" \
    --uri="https://workflowexecutions.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/workflows/myFirstWorkflow/executions" \
    --message-body="{\"argument\": \"{\\\"firstName\\\":\\\"Sherlock\\\", \\\"lastName\\\":\\\"Holmes\\\"}\"}" \
    --time-zone="America/Los_Angeles" \
    --oauth-service-account-email="sa-name@PROJECT_ID.iam.gserviceaccount.com"

该间隔使用 unix-cron 格式定义。

message-body 标志用于传递工作流参数的 JSON 编码。在本例中,名字为“Stherlock”,姓氏为“Holmes”。字符串中的双引号使用反斜杠 (\) 进行转义。

现在,您的工作流每 5 分钟执行一次。

如需详细了解 gcloud scheduler 标志,请参阅安排工作流gcloud 参考文档

运行作业并验证结果

控制台

  1. 在 Cloud Console 中,转到 Cloud Scheduler 页面:

    转到 Cloud Scheduler

    如果作业未显示,您可能需要刷新页面。

  2. 对于名为 my-workflow-job 的作业,点击立即运行

    您应该会看到 Result 值更新为 Success

  3. 在 Cloud Console 中,转到 Workflows 页面。

    转到 Workflows

  4. 在工作流列表中,点击 myFirstWorkflow 以打开其详情页面。

    工作流的执行状态应该为成功

  5. 点击工作流的执行 ID 以打开详情页面,并在“输出”窗格中查看工作流的结果。

    输出内容应为“Hello, Sherlock Holmes!”。

gcloud

  1. 运行 Cloud Scheduler 作业以执行工作流:

    gcloud scheduler jobs run my-workflow-job
    
  2. 检索工作流的执行 ID:

    gcloud workflows executions list myFirstWorkflow
    

    输出应类似于以下内容,执行 ID 以粗体显示:

    projects/316710615161/locations/us-central1/workflows/myFirstWorkflow/executions/138b31e1-f3bb-4ba7-a6da-008d0cb4a320
  3. 检索工作流的执行结果:

    gcloud workflows executions describe EXECUTION_ID --workflow myFirstWorkflow

    EXECUTION_ID 替换为上一步返回的执行 ID。

    输出应类似于以下内容:

    argument: '{"firstName":"Sherlock","lastName":"Holmes"}'
    endTime: '2021-09-09T15:15:00.869350639Z'
    name: projects/316710615161/locations/us-central1/workflows/myFirstWorkflow/executions/138b31e1-f3bb-4ba7-a6da-008d0cb4a320
    result: '"Hello, Sherlock Holmes!"'
    startTime: '2021-09-09T15:15:00.839175480Z'
    state: SUCCEEDED
    workflowRevisionId: 000001-4f9

恭喜!您已成功创建了一个 Cloud Scheduler 作业,该作业会自动按特定时间表运行工作流。

清理

完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

要删除项目,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除 Cloud Scheduler 作业

  1. 转到 Cloud Console 中的 Cloud Scheduler 页面。

    转到 Cloud Scheduler

  2. 选择作业旁边的复选框。

  3. 在页面顶部,点击删除并确认删除操作。

删除 Workflows 工作流

  1. 转到 Cloud Console 中的工作流页面。

    转到 Workflows

  2. 选择您的工作流。

  3. 点击页面顶部的删除。输入您的工作流名称,并确认删除。

停用 App Engine 应用

停用 App Engine 应用会阻止应用运行实例和处理请求,但应用数据和设置将会保留。

  1. 转到 Cloud Console 中的应用设置页面。

    转到“应用设置”

  2. 点击停用应用

  3. 请按照提示操作。

后续步骤