首页  »  AWS 教程

使用 AWS Step Functions 和 Amazon EventBridge 调度器调度无服务器工作流

发布时间:2023 年 5 月 26 日
Amazon Step Functions
Amazon EventBridge
免费套餐
Olawale Olaleye
亚马逊云科技使用经验
100 - 初级
完成所需时间
30 分钟
前提条件
  • 注册 / 登录 亚马逊云科技账户
  • *在过去 24 小时内新创建的账户可能无法使用本教程所需的服务。
所需费用

可通过免费套餐试用  

上次更新时间
2023 年 5 月 26 日

概述

通过自动响应 AWS 账户中资源的运维事件,可以帮助减少 AWS 基础设施的运维开销。例如,如果您是 DevOps 工程师或 IT 经理,您可能希望自动化执行数据处理和 ETL 作业安全和 IT 运维任务

为此,您可以按照时间计划运行无服务器工作流。Amazon EventBridge 是一个无服务器事件总线,可帮助您接收、筛选、转换、路由和分发来自 AWS 服务、您自己的应用程序以及软件即服务 (SaaS) 应用程序的事件。许多 AWS 服务都会生成事件,而 EventBridge 可以接收这些事件。Amazon EventBridge 调度器 是一款无服务器调度器,可通过一个集中式托管服务来大规模创建、运行和管理任务。您可以使用 AWS Step Functions 定义状态机,将工作流程描述为一系列步骤,并定义这些步骤之间的关系以及相应的输入和输出。

本教程将演示如何使用 EventBridge 调度器根据您定义的计划来调用状态机。虽然本教程演示的是按时间计划调用工作流,但这种做法可以推广到与其他可生成事件的 AWS 服务集成的使用场景中。

您将在本教程中使用 AWS Step Functions 和 Amazon EventBridge 调度器,均适用于 AWS 免费套餐

学习目标

在本教程中,您将:

  • 在 AWS Step Functions 中创建并定义状态机
  • 使用 Amazon EventBridge 调度器创建计划
  • 自定义状态机处理输入和输出的方式
  • 验证状态机工作流是否按预期运行

前提条件

在开始本教程之前,需要满足以下条件:

  • 拥有 AWS 账户:如果您还没有账户,请参阅设置 AWS 环境指南获取快速入门概览。

操作步骤

步骤 1:创建 AWS Identity and Access Management (IAM) 角色

AWS Step Functions 可以运行代码并访问其他 AWS 资源(例如存储在 Amazon S3 存储桶中的数据)。出于安全考虑,您必须使用 AWS IAM 向 Step Functions 授予访问这些资源的权限。

a. 请在另一个浏览器窗口中打开 AWS 管理控制台,使本分步指南保持打开状态,以便一边操作一边参照本教程。页面加载后,输入您的用户名和密码即可开始使用。接下来,在搜索栏中输入 IAM,选择 IAM 以打开该服务的控制台。

b. 在左侧导航窗格中选择 Roles(角色),然后点击 Create role(创建角色)。

c. 在 Select trusted entity(选择受信任实体)页面上的 AWS service(AWS 服务)下,从列表中选择 Step Functions,然后点击 Next(下一步)。  

d. 在 Add permissions(添加权限)页面上,点击 Next(下一步)。

e. 在 Review(检查)页面上,输入 step_functions_basic_execution 作为 Role name(角色名称),然后点击 Create role(创建角色)。

f. 新的 IAM 角色已经创建完成。

步骤 2:创建 AWS Step Functions 状态机

在此步骤中,您将使用 Pass 状态创建一个简单、独立运行的状态机。Pass 状态只是将输入传递给输出,实际上不执行任何操作。
 
不过,在实际应用场景中,无服务器工作流可以完成您所需的任何任务。例如,您可以协调多个 Lambda 函数来执行任务、做出决策等。不过,为了简单起见,在本教程中我们将保持工作流的简洁性。

a. AWS Step Functions 提供了多种预定义的状态机模板。在本教程中,您将使用 Hello World 模板创建状态机。前往 Step Functions 控制台的 State machines(状态机)部分,然后点击 Create state machine(创建状态机)。

b. 选择 Write your workflow in code(使用代码编写工作流)。Step Functions 将使用 Amazon States Language 在 State machine definition(状态机定义)窗格中填充状态机描述。关于如何定义状态机的更多信息,请参阅状态机结构。点击 Next(下一步)。

c. 在 Specify details(指定详细信息)部分中,对于 State machine name(状态机名称),输入 ScheduledWorkflow,然后在 Permissions (权限)> Execution role (执行角色)下,选择 Choose an existing role(选择现有角色)。在 Existing roles(现有角色)下,选择您之前创建的 IAM 角色 step_functions_basic_execution。点击 Create state machine(创建状态机)。

d. 至此,您的状态机已准备就绪,可以开始执行。

步骤 3:使用 Amazon EventBridge 调度器创建计划

状态机创建完成后,您可以使用 Amazon EventBridge 调度器按照计划运行状态机。您可以使用 cron 和 rate 表达式为周期性模式创建计划,或者配置一次性调用,而无需预配和管理基础设施。

a. 在搜索栏中输入 Scheduler,前往 EventBridge 调度器控制台

b. 在 Schedules(计划)页面,点击 Create schedule(创建计划)。

c. 在 Specify schedule detail(指定计划详情)页面,执行以下操作:

  1. 输入 Schedule name(计划名称),如 ExecuteStateMachine;以及 Description - optional (描述 - 可选),如 Execute state machine every minute
  2. 在 Schedule pattern(计划模式)部分,选择 Recurring schedule(周期性计划),然后选择 Rate-based schedule(基于 Rate 的计划)。
  3. 在 Rate expression(Rate 表达式)部分,Value(值)字段中输入 1Unit(单位)下拉列表中选择 minutes(分钟)。
  4. 对于 Flexible time window(灵活时间窗口),选择 Off(关闭),禁用此选项。其他选项保持默认设置,点击 Next(下一步)。

d. 在 Select target(选择目标)页面,执行以下操作:

  1.  Target detail(目标详情)部分,从 Frequently used APIs(常用 API)选项中选择 AWS Step Functions
  2. 在 StartExecution 部分,从 State machine(状态机)下拉列表中选择 ScheduledWorkflow
  3.  Input(输入)更新为以下 JSON 代码。
{
    "Payload": "This is a test."
}

4.  点击 Next(下一步)。

e. 在 Settings(设置)页面,保持所有默认设置。Amazon EventBridge 会自动创建一个具有必要权限的新角色。点击 Next(下一步)。

f. 在 Review and create schedule(检查并创建计划)页面,点击 Create schedule(创建计划)。

g. 至此,状态机的新执行将每分钟运行一次。  

步骤 4:自定义状态机处理输入和输出的方式

接下来,您将自定义状态机处理输入和输出的方式。了解信息如何从一个状态流向另一个状态,并学习如何筛选和操作这些数据,将有助于您在 AWS Step Functions 中有效地设计和实施工作流。

a. 回到 Step Functions 控制台,此时控制台中应该还显示着您的 ScheduledWorkflow 状态机。点击 Edit(编辑)。

b. 在 Definition(定义)窗口中,查看状态机代码的第 7 行和第 12 行。Pass 状态的 Result 字段指定了要传递给下一个状态的输出。由于您的状态机由两个按顺序执行的状态组成,所以消息 Hello! 将从第一个 Hello 状态传递至 World 状态,然后消息 World 将传递至工作流程的结束状态。

c. 您可能记得,Step Functions 的 Pass 状态只是将输入传递至输出。所以,您可以使用 ResultPath 字段来修改状态的输出。例如,您可以用状态产生的结果(例如 Task 状态的 Lambda 函数输出)替换状态输入。

要将状态的输入与其结果结合起来,请按照下面的示例为两个状态添加新行:

{
  "Comment": "A Hello World example of the Amazon States Language using Pass states",
  "StartAt": "Hello",
  "States": {
    "Hello": {
      "Type": "Pass",
      "Result": "Hello",
      "ResultPath": "$.taskresult",
      "Next": "World"
    },
    "World": {
      "Type": "Pass",
      "Result": "World",
      "ResultPath": "$.taskresult",
      "End": true
    }
  }
}

这将把调用状态机执行的 EventBridge 事件的详细信息与每个状态的输出结合在一起。要了解更多信息,请参阅 Step Functions 中的输入和输出处理。

d. 点击 Save(保存)。

步骤 5:验证工作流程按预期运行

Amazon EventBridge 调度器正在每分钟触发一次状态机工作流程的执行。在此步骤中,您将观察这些执行情况,并验证 Step Functions 是否能捕获事件的详细信息。

a. 返回 Step Functions 控制台的 State machines(状态机)部分,然后点击 ScheduledWorkflow

b. 在 Executions(执行)下,您可以看到 EventBridge 调度器触发的执行情况。您可以点击刷新按钮来更新窗口,以便观察新的状态机执行情况。等待几分钟,以便至少启动两个工作流实例。

c. 打开其中一个执行的上下文菜单(右键点击),在新的浏览器标签页中打开链接。选择 Execution input and output(执行输入和输出)选项卡。

您可以看到,输入事件已经与状态机的输出结合在一起了。

步骤 6:清理资源

在此步骤中,您将清理 AWS Step Functions 和 Amazon EventBridge 调度器资源。
 
重要提示:删除当前未使用的资源可降低成本。请务必及时删除不再使用的资源。未清理资源可能会产生费用。

a. 关闭各个状态机执行详情页面的标签页。在 Step Functions 窗口的左上角,选择 State machines(状态机)。在 State machines(状态机)窗口中,选中您在本教程中创建的状态机,然后点击 Delete(删除)。

b. 在 Delete state machine(删除状态机)对话框中,在文本框内输入 delete 以确认删除操作,然后点击 Delete(删除)。一旦 Step Functions 确认所有正在进行的执行都已完成,您的状态机将在一两分钟内被删除。

c. 接下来,您将删除 Amazon EventBridge 调度器计划。在 EventBridge 调度器控制台,选择 Actions(操作)>Delete(删除)。再次点击 Delete(删除)以确认删除操作。

d. 点击左上角的 Services(服务),在搜索栏中输入 IAM,进入 IAM 控制台。

e. 在左侧导航栏中,选择 Roles(角色)。

f. 选中您在本教程中创建的两个 IAM 角色,点击 Delete(删除)。在删除确认对话框的文本输入框中输入 delete,然后点击 Delete(删除)以确认删除操作。

至此,您可以登出 AWS 管理控制台了。

总结

恭喜您!您已成功创建了计划使无服务器工作流每分钟运行一次。通过 AWS Step Functions,您可以检查周期性任务的执行情况,确保它们始终如一地执行。通过结合使用 AWS Step Functions 与 Amazon EventBridge 调度器,您可以自动执行每日、每周和每月任务。