了解如何开始使用 Step Functions - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

了解如何开始使用 Step Functions

借助 Step Functions 服务,您可以编排复杂的应用程序工作流。首先,您将使用 Workflow Studio 创建和运行内置的 Hello World 工作流。您将在代码中检查自动生成的 Amazon States Language(ASL)定义。最后,您将拖放服务集成来进行情绪分析。

完成本教程后,您将知道如何使用 Workflow Studio 在设计代码模式下创建、配置、运行和更新工作流。

预计持续时间:20-30 分钟

您要构建什么

您的第一个状态机将从流状态开始。流状态用于指导和控制您的工作流。在您了解如何运行工作流后,即可添加操作,以便将 Amazon Comprehend 服务与 Task 状态集成。

下图显示了您将要构建的完整状态机的可视化示意图。首次创建 Hello World 状态机时,不需要额外的资源即可运行。只需单击一下即可在 Step Functions 控制台中创建所有状态和 IAM 角色。稍后,当您添加服务集成时,您将需要创建一个具有自定义权限策略的角色。

Hello World 工作流的可视化表示。

第 1 步 – 创建状态机

在 Step Functions 中,工作流称为状态机。我们将这两个术语互换使用。工作流将包含状态,用于执行操作控制状态机的流

  1. 转至 Step Functions 控制台

  2. 在 Step Functions 控制台中,从左上角的导航栏或面包屑导航中选择“Step Functions”,然后选择开始使用

    说明性屏幕截图,显示了如何开始使用 Hello World 工作流
  3. 从选项中选择运行 Hello World

    说明性屏幕截图,显示了如何选择 Hello World 工作流
提示

为了熟悉用户界面,我们建议您逐步完成控制台中的简短演练。

Workflow Studio 概览

使用 Step Functions 的 Workflow Studio,可以直观地将状态拖放到画布上,来构建工作流。

您可以添加和编辑状态、配置步骤、转换结果以及设置错误处理。以下屏幕截图显示了用于构建状态机的界面的四个重要区域。

Workflow Studio 界面四个重要区域的说明性屏幕截图

模式 - Workflow Studio 提供三种操作模式,默认为视觉设计模式。

  • 设计 - 一种可视化编辑模式,您可以在此模式下将状态拖放到工作流中。

  • 代码 - 一种侧重于 Amazon States Language 代码(也称为 ASL 代码)的模式。您可以直接编辑 ASL 代码并查看视觉设计中反映的更改。

  • 配置 - 配置选项,包括状态机的名称和类型(标准或快速)、工作流运行时分配的角色、日志记录、跟踪、版本控制、加密和标签。

状态浏览器包含以下三个选项卡:

  • 操作 - 您可以拖放到工作流中的 Amazon API 列表。每个操作都代表一个 Task 工作流状态。

  • - 用于控制工作流中步骤顺序的流状态。

  • 模式 - 开箱即用、可重复使用的构建块,例如对 Amazon S3 存储桶中的数据进行迭代处理。

画布和工作流图中,您可以将状态拖放到工作流图上、更改状态的顺序以及选择要配置和测试的状态。

检查器面板中,您可以查看和编辑画布上所选的任何状态的属性。您可以打开定义开关以显示当前所选状态的代码。

状态机概述

Hello World 工作流从 Pass 状态开始,该状态会将其输入传递到其输出,而无需执行工作。Pass 状态可用于生成静态 JSON 输出或转换 JSON 输入,然后再将数据传递到下一个状态。Pass 状态在构造和调试状态机时非常有用。

下一个状态(即 Choice 状态),使用 IsHelloWorldExample 中的数据来选择工作流的下一个分支。如果第一条规则匹配,则工作流将在 Wait 状态下暂停,然后以 Parallel 状态运行两个任务,然后进入检查点并成功结束工作流。如果没有匹配项,则在停止状态机之前,工作流会默认处于 Fail 状态

如果您希望在执行更多工作之前先暂停一段时间,Wait 状态会很有用。也许您的工作流会在订单录入后等待 30 秒,因此您的客户有时间注意到并修复错误的配送地址。

Parallel 状态可以对您的数据运行多个进程。也许工作流会同时打印订单凭据、更新库存和增加每日销售报告。

开始实验 Hello World 工作流的说明性图片

查看工作流代码(ASL)

实际上,您的第一个状态机非常详细,因此请查看代码以进一步探索。

状态机是使用 Amazon States Language(ASL)来定义的,这是一种开源规范,它定义了一种基于 JSON 的语言,用于以声明式方式描述状态机。

查看整个状态机定义

  1. 选择 { } Code 按钮来查看 ASL 代码。

  2. 查看左边的代码,并与右边的状态机图进行比较。

  3. 在画布上选择一些状态进行检查。例如,选择 Choice 状态

代码视图的说明性图片

您是否注意到,该状态的定义已在代码视图中突出显示?

在检查器中查看代码

  1. 切换回设计模式。

  2. 展开右侧的检查器面板

  3. 从画布上的工作流图中选择 Choice 状态

  4. 检查器面板中,选择定义开关。

尝试选择其他状态。看看您选择的每个状态的 ASL 代码是如何滚动到视图中并突出显示的?

(实际上)创建状态机

警告:立即为您的状态机命名!

创建状态机后,您无法对其进行重命名。在保存状态机之前选择一个名称。

到目前为止,您一直在编辑状态机的草稿版本。尚未创建任何资源。

重命名和创建状态机

  1. 选择配置模式

  2. 对于状态机名称,请输入 MyFirstStateMachine

  3. 对于权限,请接受默认的创建新角色

  4. 选择创建按钮以实际创建您的状态机。

您应该会看到关于您的状态机和新 IAM 角色已创建的通知。

系统将自动显示启动状态机的选项。您将在下一步中执行该操作!

开始实验 Hello World 工作流的说明性图片
工作流创建完成!

Step Functions 创建了您的工作流和 IAM 角色。现在,您可以启动状态机了。

第 2 步 - 启动状态机

创建状态机后,您可以启动工作流运行。

工作流可以接收输入,这些输入可以在当前状态中使用、发送给集成服务,以及传递给下一个状态。

Hello World 状态机是独立的,不需要输入。

开始使用的说明性图片

启动状态机

  1. 为执行的名称输入 hello001

  2. 将输入字段留空

  3. 选择启动执行按钮。

启动工作流的说明性图片。

查看执行详细信息

启动后,您应该会立即看到前两个状态已成功

稍等片刻后,其余的状态转换将运行以完成工作流。

您想知道 Choice 状态Is Hello World Example?)如何决定分支到 Wait for X Seconds 状态吗?

  1. 提示:状态机中的第一步包含分支决策所需的数据

  2. 图表视图中,您可以监控执行的进度并浏览每种状态的详细信息。

  3. 选择第一个 Pass 状态(名为 Set Variables and State Output),然后查看输入/输出选项卡。

您应该会看到状态输入为空,但状态输出包含将 IsHelloWorldExample 的值设置为 true 的 JSON。

执行 001

图表视图切换到表格视图,按名称、类型和状态查看状态列表。

执行 001 表格视图
提示

请注意上一个屏幕截图中的持续时间时间线字段。一眼就能看出哪些状态比其他状态花费了更多时间。

在这个执行详细信息页面上还提供了另外两个视图:事件视图状态视图

事件视图是流从一个状态切换到另一个状态的详细粒度视图。

展开事件视图表中的第一个 PassStateEnteredPassStateExited 事件,以查看该状态如何不接收任何输入、将名为 CheckpointCount 的变量赋值为零,以及生成您之前看到的输出。

执行 001 事件视图

最后,状态视图类似于表格视图。在状态视图表中,您可以有选择地展开状态,以便仅查看每个状态的输入和输出:

执行 001 状态视图
恭喜您!您已经运行了第一个 Step Functions 状态机!

使用 Pass 状态将静态数据添加到工作流是一种常见的模式,尤其是在进行故障排除时。

在下一步中,您将更新工作流,以便动态地设置状态机输入。

第 3 步 - 处理外部输入

在工作流中将 IsHelloWorldExample 的值设置为常量值是不现实的。您应该预期您的状态机会接收到各种不同的输入数据,并能正确响应。

在此步骤中,我们将向您介绍如何使用外部 JSON 数据作为工作流的输入:

处理外部输入

移除硬编码的输入

首先,替换第一个 Pass 状态的输出中的硬编码值。

  1. 选择页面右上角的编辑状态机按钮,编辑您的 Hello World 状态机。

  2. 选择启动后的第一个 Pass 状态(名为 Set Variables and State Output),然后选择输出选项卡。

  3. 输出替换为以下 JSON:

    { "IsHelloWorldExample": "{% $states.input.hello_world %}", "ExecutionWaitTimeInSeconds": "{% $states.input.wait %}" }
  4. 保存状态机。

更新后的状态输出将使用 JSONata 表达式从保留的 $states 变量中提取输入数据。这些值将作为输出传递到下一个状态,成为下一个状态的输入。

使用输入数据运行更新的工作流

接下来,运行工作流并以 JSON 格式提供外部输入数据。

  1. 选择执行按钮以运行工作流。

  2. 对于名称,请使用随机生成的 ID。

  3. 为输入字段使用以下 JSON:

    { "wait" : 20, "hello_world": true }
  4. 选择启动执行按钮。

您的状态机执行应该等待更长的时间(20 秒),但使用您提供的输入,执行最终应该会成功。

在图表视图中,检查第一个 Pass 状态的输入/输出。请注意您提供的输入如何转换为输出。另外,请查看执行详细信息页面顶部的执行输入和输出。两个位置都显示您用于启动执行的输入。

提示

如果您在 hello_world 设置为 false 的情况下运行新的执行,您预期会发生什么? 试试看!

查看工作流执行情况

现在,您已经运行了几次工作流,请查看执行详细信息,以便查看工作流的运行情况。

查看执行详细信息

  1. 从导航面包屑或左侧菜单中选择状态机

  2. 选择您的状态机。

执行选项卡中,您应该看到一个执行列表,类似于以下屏幕截图:

显示了 hello 工作流执行示例列表的说明性屏幕截图。

最后提醒一点:工作流执行名称必须唯一,并且不能重复使用。尽管我们在本教程中建议使用短名称(hello001),但我们建议对生产工作负载采用一种能始终保证唯一性的命名约定。

提示

恭喜您!您已修改工作流以处理每次运行工作流时都可能不同的外部输入

第 4 步 - 集成服务

Step Functions 状态机可以使用 Amazon SDK 集成调用超过 220 种 Amazon 服务。Amazon 服务为您的状态机提供超过 1 万个可能的 API 操作。

在此步骤中,您将集成用于情绪分析的 Amazon Comprehend 任务,以处理您的状态机输入。

服务集成使用三种服务集成模式之一:

  1. 请求响应(默认)- 等待 HTTP 响应,然后立即进入下一个状态。

  2. 运行作业.sync)- 等待作业完成后再进入下一步。

  3. 等待回调.waitForTaskToken)- 暂停工作流,直到外部进程返回任务令牌。

描绘服务集成的说明性屏幕截图。

对于首次集成,您将使用请求响应(默认)集成模式。

集成如何工作?

一个 Task 状态代表状态机执行的一个工作单元。您状态机中的所有工作由任务完成。

任务通常通过将输入传递给其他服务的 API 操作来执行工作,然后这些服务执行自己的工作。您可以使用多个字段来指定任务的执行方式,这些字段包括:CredentialsRetryCatchTimeoutSeconds 等。您可以在 Task 工作流程状态 中了解有关任务的更多信息。

要使用 Amazon SDK 集成,您需要指定要调用的服务名称API。有些集成还需要参数。

您可以在任务状态的资源字段中使用 Amazon States Language 来指定 Amazon API 操作。您可以选择在服务名称中添加服务集成类型。

要指定 API 操作,可使用以下资源名称模板:

arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]
参数名称大小写

请注意,API 操作将采用 camelCase 拼写法(首字母小写),而 ParameterNames 将采用 Pascal 拼写法(首字母大写)。

资源名称的示例

  • arn:aws:states:::aws-sdk:ec2:describeInstances 将返回调用 Amazon EC2 describeInstances API 的结果。

  • arn:aws:states:::aws-sdk:s3:listBuckets 将返回调用 Amazon S3 listBuckets API 的结果。

  • arn:aws:states:::aws-sdk:sfn:startExecution 将启动嵌套 Step Functions 状态机执行并返回该工作流的结果。

当 Step Functions 使用 Task 状态调用另一个服务时,默认模式为请求响应。使用请求响应集成模式时,Step Functions 会调用服务,接收响应,然后立即进入下一个状态。

情绪检测集成

第 4.1 步 - 添加情绪分析状态

  1. 编辑您的 MyFirstStateMachine 状态机。

  2. 状态浏览器操作面板中搜索 DetectSentiment

  3. Comprehend DetectSentiment 拖放到 Choice 状态默认分支上。

  4. 选择并删除 Fail 状态。

  5. 状态浏览器选项卡中,将成功状态拖到 DetectSentiment 之后。

第 4.2 步 - 配置情绪分析状态

  1. 选择 Comprehend 步骤以在检查器面板中对其进行配置。

  2. 选择参数和输出选项卡,然后将参数替换为以下 JSON:

    { "LanguageCode": "en", "Text": "{% %}" }
  3. 将光标置于百分号 {% %} 之间,然后键入:$

  4. 在编辑器中使用自动完成功能来选择 states

    然后键入 . 并选择 context

    然后键入 . 并选择 Execution

    然后键入 . 并选择 Input

    最后,键入 .feedback_comment 以从上下文对象中检索初始输入。

选择这些自动完成选项后,您的状态 Arguments 应该具有以下 JSON:

{ "LanguageCode": "en", "Text": "{% $states.context.Execution.Input.feedback_comment %}" }
使用编辑器自动完成

使用编辑器自动完成功能,您可以探索自己的选项。

自动完成将列出您的变量、包含上下文对象的保留 $states 变量以及可用函数及其定义!

第 4.3 步 - 配置身份策略

在可以运行工作流之前,您需要创建角色策略以允许状态机对外部服务执行 API 调用。

为 Step Functions 创建 IAM 角色

  1. 在新选项卡中转到 IAM 控制台,然后选择角色

  2. 选择创建新角色

  3. 可信实体类型中,选择 Amazon 服务

  4. 使用案例中,选择 Step Functions

  5. 添加权限中,选择下一步以接受默认策略。创建角色后,您将为 Comprehend 添加策略。

  6. 名称中,输入 HelloWorldWorkflowRole

  7. 选择创建角色

为 Amazon Comprehend 将策略添加到 HelloWorldWorkflowRole

  1. 选择并编辑 HelloWorldWorkflowRole 角色。

  2. 选择添加权限,然后选择创建内联策略

  3. 为服务选择 Comprehend

  4. 读取中,选择 DetectSentiment,然后选择下一步

  5. 策略名称中,输入 DetectSentimentPolicy,然后选择创建策略

如果查看该政策,您会发现该策略允许所有资源执行操作 "comprehend:DetectSentiment"

将 IAM 角色附加到 Step Functions 状态机

  1. 返回编辑状态机并选择配置选项卡。

  2. 执行角色下拉菜单中选择 HelloWorldWorkflowRole

  3. 保存您的状态机。

第 4.4 步 - 运行您的状态机

使用以下 JSON 作为输入开始执行您的状态机:

{ "hello_world": false, "wait": 42, "feedback_comment" : "This getting started with Step Functions workshop is a challenge!" }

如果没有正确的策略,您会看到类似于以下内容的权限错误

User: arn:aws:sts::account-id:assumed-role/StepFunctions-MyStateMachine-role is not authorized to perform: comprehend:DetectSentiment because no identity-based policy allows the comprehend:DetectSentiment action (Service: Comprehend, Status Code: 400, Request ID: a1b2c3d4-5678-90ab-cdef-EXAMPLE11111)

前面的错误消息指明您的状态机无权使用外部服务。向后退一步,确保您已配置身份策略。

练习您所学的内容!

在深入研究更复杂的工作流之前,请使用以下任务练习所学内容:

  • 查看 DetectSentiment 步骤。查看各种视图中的输入/输出,以查看情绪检测的结果。

  • 在表格视图中查找 DetectSentiment 状态的持续时间

  • 更改 JSON 输入中的注释,然后重新运行您的状态机。

要了解有关情绪分析结果的更多信息,请参阅 Amazon Comprehend - Sentiment

考虑请求响应集成的一种方法是,响应通常仅表示请求的确认。但在某些集成中(例如情感分析),确认实际上表示任务的完成

关键要点是,在请求响应集成中,Task 状态不会等待底层任务完成。要等待响应,您需要探索运行作业(.sync)服务集成模式。

恭喜您!

您创建了第一个状态机并使用请求响应模式集成了情绪分析任务。

我们非常重视您的反馈!

如果您觉得本入门教程很有帮助,或者您有改进教程的建议,请使用此页面上的反馈选项告诉我们。

清理资源

执行以下步骤来清理您创建的资源:

  1. 导航到 Amazon 管理控制台中的 Step Functions 页面。

  2. 从左侧导航窗格中选择状态机

  3. 选择 MyFirstStateMachine

  4. 删除 IAM 角色

    1 - 单击 IAM 角色的链接以在新选项卡中转到 IAM 角色页面。删除自定义相关角色。

    2 - 在“IAM 角色”中,搜索包含 MyFirstStateMachine 的自动生成角色。删除自动生成的角色。

  5. 返回 Step Functions 控制台选项卡,选择操作下拉列表,然后选择删除以删除状态机。

现在,您的状态机和相关角色应该已成功删除。