本教程介绍如何使用 Cloud Scheduler 自动执行工作流,以便工作流按特定时间表运行,在本例中,每 5 分钟运行一次。
目标
- 创建和部署可以接收运行时参数的工作流。
- 创建 Cloud Scheduler 作业,以便触发工作流并每 5 分钟执行一次该作业,并以正确的格式传入 JSON 参数。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
- 为 Cloud Scheduler 设置环境,包括创建 App Engine 应用。
-
Enable the Workflows API.
- 设置本教程中使用的默认位置:
将gcloud config set workflows/location REGION
REGION
替换为支持的 Workflows 位置。 - 创建服务账号以供 Workflows 使用;例如
sa-name
。gcloud iam service-accounts create sa-name
- 向您的服务账号授予
workflows.invoker
角色,以便该账号有权触发您的工作流:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:sa-name@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/workflows.invoker"
将 - 将
logging.logWriter
角色授予服务账号。gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:sa-name@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/logging.logWriter"
PROJECT_ID
替换为您的 Google Cloud 项目 ID。
创建接收运行时参数的工作流
工作流定义由一系列使用 Workflows 语法描述的步骤组成,该语法可以采用 YAML 或 JSON 格式编写。创建工作流后,可以进行部署,使其可以执行。
控制台
在 Google Cloud 控制台中,转到 Workflows 页面:
点击创建。
输入
myFirstWorkflow
作为新工作流的名称。选择 us-central1 作为区域。
选择您之前创建的服务账号。
点击下一步。
在工作流编辑器中,输入工作流的定义。
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”问候语。
点击部署。
gcloud
- 打开终端。
将以下工作流定义保存为 YAML 或 JSON 文件,例如 myFirstWorkflow.yaml 或 myFirstWorkflow.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”问候语。
输入以下命令以部署工作流:
gcloud workflows deploy myFirstWorkflow \ --source=myFirstWorkflow.yaml_OR_json \ --service-account=sa-name@PROJECT_ID.iam.gserviceaccount.com
将
yaml_OR_json
替换为yaml
或json
,具体取决于您之前创建的 Workflows 定义文件的格式。
安排工作流
通过使用先前创建的服务账号创建 Cloud Scheduler 作业,以触发工作流。
控制台
在 Google Cloud 控制台中,前往 Cloud Scheduler 页面:
点击创建作业。
将名称设置为
my-workflow-job
。对于频率,输入:
这将每 5 分钟执行一次作业。间隔用 unix-cron 格式。*/5 * * * *
对于时区,请选择国家/地区和时区。
例如,选择美国和洛杉矶或太平洋夏令时 (PDT)。
点击继续。
对于目标类型,选择 HTTP。
对于网址,请输入:
https://workflowexecutions.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/workflows/myFirstWorkflow/executions
将 HTTP 方法保留为 POST 的默认值。
添加以下两个 HTTP 标头:
- 名称:
Content-Type
,值:application/octet-stream
- 名称:
User-Agent
,值:Google-Cloud-Scheduler
- 名称:
对于正文,请输入:
{"argument": "{\"firstName\":\"Sherlock\", \"lastName\":\"Holmes\"}"}
这将传递工作流参数的 JSON 编码;在此示例中,名字为“Sherlock”和姓氏“Holmes”。字符串中的双引号使用反斜杠 (\) 进行转义。
在身份验证标头部分,选择添加 OAuth 令牌。
输入您之前创建的服务账号。
您不必将范围指定为 已使用sa-name@PROJECT_ID.iam.gserviceaccount.com
https://www.googleapis.com/auth/cloud-platform
。接受所有其他默认设置,然后点击创建。
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
参考文档。
运行作业并验证结果
控制台
在 Google Cloud 控制台中,前往 Cloud Scheduler 页面:
如果作业未显示,您可能需要刷新页面。
对于名为
my-workflow-job
的作业,点击立即运行。您应该会看到 Result 值更新为 Success。
在 Google Cloud 控制台中,转到 Workflows 页面:
在工作流列表中,点击 myFirstWorkflow 以打开其详情页面。
工作流的执行状态应该为成功。
点击工作流的执行 ID 以打开详情页面,并在“输出”窗格中查看工作流的结果。
输出内容应为“Hello, Sherlock Holmes!”。
gcloud
运行 Cloud Scheduler 作业以执行工作流:
gcloud scheduler jobs run my-workflow-job
检索工作流的执行 ID:
gcloud workflows executions list myFirstWorkflow
输出应类似于以下内容,执行 ID 以粗体显示:
projects/316710615161/locations/us-central1/workflows/myFirstWorkflow/executions/138b31e1-f3bb-4ba7-a6da-008d0cb4a320
检索工作流的执行结果:
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 作业,该作业会自动按特定时间表运行工作流。
清理
完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除 Cloud Scheduler 作业
在 Google Cloud 控制台中,转到 Cloud Scheduler 页面。
选择作业旁边的复选框。
在页面顶部,点击删除并确认删除操作。
删除 Workflows 工作流
前往 Google Cloud 控制台中的工作流页面。
选择您的工作流。
点击页面顶部的删除。输入您的工作流名称,并确认删除。
停用 App Engine 应用
停用 App Engine 应用会阻止应用运行实例和处理请求,但应用数据和设置将会保留。
前往 Google Cloud 控制台中的应用设置页面。
点击停用应用。
请按照提示操作。
后续步骤
- 详细了解工作流。