了解如何开始使用 Step Functions
借助 Step Functions 服务,您可以编排复杂的应用程序工作流。首先,您将使用 Workflow Studio 创建和运行内置的 Hello World 工作流。您将在代码中检查自动生成的 Amazon States Language(ASL)定义。最后,您将拖放服务集成来进行情绪分析。
完成本教程后,您将知道如何使用 Workflow Studio 在设计和代码模式下创建、配置、运行和更新工作流。
预计持续时间:20-30 分钟
您要构建什么
您的第一个状态机将从流状态开始。流状态用于指导和控制您的工作流。在您了解如何运行工作流后,即可添加操作,以便将 Amazon Comprehend 服务与 Task 状态集成。
下图显示了您将要构建的完整状态机的可视化示意图。首次创建 Hello World 状态机时,不需要额外的资源即可运行。只需单击一下即可在 Step Functions 控制台中创建所有状态和 IAM 角色。稍后,当您添加服务集成时,您将需要创建一个具有自定义权限策略的角色。
第 1 步 – 创建状态机
在 Step Functions 中,工作流称为状态机。我们将这两个术语互换使用。工作流将包含状态,用于执行操作或控制状态机的流。
-
转至 Step Functions 控制台。
-
在 Step Functions 控制台中,从左上角的导航栏或面包屑导航中选择“Step Functions”,然后选择开始使用:
-
从选项中选择运行 Hello World:
提示
为了熟悉用户界面,我们建议您逐步完成控制台中的简短演练。
Workflow Studio 概览
使用 Step Functions 的 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 状态可以对您的数据运行多个进程。也许工作流会同时打印订单凭据、更新库存和增加每日销售报告。
查看工作流代码(ASL)
实际上,您的第一个状态机非常详细,因此请查看代码以进一步探索。
状态机是使用 Amazon States Language(ASL)
查看整个状态机定义
-
选择 { } Code 按钮来查看 ASL 代码。
-
查看左边的代码,并与右边的状态机图进行比较。
-
在画布上选择一些状态进行检查。例如,选择 Choice 状态。
您是否注意到,该状态的定义已在代码视图中突出显示?
在检查器中查看代码
-
切换回设计模式。
-
展开右侧的检查器面板。
-
从画布上的工作流图中选择 Choice 状态。
-
在检查器面板中,选择定义开关。
尝试选择其他状态。看看您选择的每个状态的 ASL 代码是如何滚动到视图中并突出显示的?
(实际上)创建状态机
警告:立即为您的状态机命名!
创建状态机后,您无法对其进行重命名。在保存状态机之前选择一个名称。
到目前为止,您一直在编辑状态机的草稿版本。尚未创建任何资源。
重命名和创建状态机
-
选择配置模式。
-
对于状态机名称,请输入
MyFirstStateMachine -
对于权限,请接受默认的创建新角色。
-
选择创建按钮以实际创建您的状态机。
您应该会看到关于您的状态机和新 IAM 角色已创建的通知。
系统将自动显示启动状态机的选项。您将在下一步中执行该操作!
工作流创建完成!
Step Functions 创建了您的工作流和 IAM 角色。现在,您可以启动状态机了。
第 2 步 - 启动状态机
创建状态机后,您可以启动工作流运行。
工作流可以接收输入,这些输入可以在当前状态中使用、发送给集成服务,以及传递给下一个状态。
Hello World 状态机是独立的,不需要输入。
启动状态机
-
为执行的名称输入
hello001。 -
将输入字段留空。
-
选择启动执行按钮。
查看执行详细信息
启动后,您应该会立即看到前两个状态已成功。
稍等片刻后,其余的状态转换将运行以完成工作流。
您想知道 Choice 状态(Is Hello World Example?)如何决定分支到 Wait for X Seconds 状态吗?
-
提示:状态机中的第一步包含分支决策所需的数据
-
在图表视图中,您可以监控执行的进度并浏览每种状态的详细信息。
-
选择第一个 Pass 状态(名为 Set Variables and State Output),然后查看输入/输出选项卡。
您应该会看到状态输入为空,但状态输出包含将 IsHelloWorldExample 的值设置为 true 的 JSON。
从图表视图切换到表格视图,按名称、类型和状态查看状态列表。
提示
请注意上一个屏幕截图中的持续时间和时间线字段。一眼就能看出哪些状态比其他状态花费了更多时间。
在这个执行详细信息页面上还提供了另外两个视图:事件视图和状态视图。
事件视图是流从一个状态切换到另一个状态的详细粒度视图。
展开事件视图表中的第一个 PassStateEntered 和 PassStateExited 事件,以查看该状态如何不接收任何输入、将名为 CheckpointCount 的变量赋值为零,以及生成您之前看到的输出。
最后,状态视图类似于表格视图。在状态视图表中,您可以有选择地展开状态,以便仅查看每个状态的输入和输出:
恭喜您!您已经运行了第一个 Step Functions 状态机!
使用 Pass 状态将静态数据添加到工作流是一种常见的模式,尤其是在进行故障排除时。
在下一步中,您将更新工作流,以便动态地设置状态机输入。
第 3 步 - 处理外部输入
在工作流中将 IsHelloWorldExample 的值设置为常量值是不现实的。您应该预期您的状态机会接收到各种不同的输入数据,并能正确响应。
在此步骤中,我们将向您介绍如何使用外部 JSON 数据作为工作流的输入:
移除硬编码的输入
首先,替换第一个 Pass 状态的输出中的硬编码值。
-
选择页面右上角的编辑状态机按钮,编辑您的 Hello World 状态机。
-
选择启动后的第一个 Pass 状态(名为 Set Variables and State Output),然后选择输出选项卡。
-
将输出替换为以下 JSON:
{ "IsHelloWorldExample": "{% $states.input.hello_world %}", "ExecutionWaitTimeInSeconds": "{% $states.input.wait %}" } -
保存状态机。
更新后的状态输出将使用 JSONata 表达式从保留的 $states 变量中提取输入数据。这些值将作为输出传递到下一个状态,成为下一个状态的输入。
使用输入数据运行更新的工作流
接下来,运行工作流并以 JSON 格式提供外部输入数据。
-
选择执行按钮以运行工作流。
-
对于名称,请使用随机生成的 ID。
-
为输入字段使用以下 JSON:
{ "wait" : 20, "hello_world": true } -
选择启动执行按钮。
您的状态机执行应该等待更长的时间(20 秒),但使用您提供的输入,执行最终应该会成功。
在图表视图中,检查第一个 Pass 状态的输入/输出。请注意您提供的输入如何转换为输出。另外,请查看执行详细信息页面顶部的执行输入和输出。两个位置都显示您用于启动执行的输入。
提示
如果您在 hello_world 设置为 false 的情况下运行新的执行,您预期会发生什么? 试试看!
查看工作流执行情况
现在,您已经运行了几次工作流,请查看执行详细信息,以便查看工作流的运行情况。
查看执行详细信息
-
从导航面包屑或左侧菜单中选择状态机。
-
选择您的状态机。
在执行选项卡中,您应该看到一个执行列表,类似于以下屏幕截图:
最后提醒一点:工作流执行名称必须唯一,并且不能重复使用。尽管我们在本教程中建议使用短名称(hello001),但我们建议对生产工作负载采用一种能始终保证唯一性的命名约定。
提示
恭喜您!您已修改工作流以处理每次运行工作流时都可能不同的外部输入。
第 4 步 - 集成服务
Step Functions 状态机可以使用 Amazon SDK 集成调用超过 220 种 Amazon 服务。Amazon 服务为您的状态机提供超过 1 万个可能的 API 操作。
在此步骤中,您将集成用于情绪分析的 Amazon Comprehend 任务,以处理您的状态机输入。
服务集成使用三种服务集成模式之一:
-
请求响应(默认)- 等待 HTTP 响应,然后立即进入下一个状态。
-
运行作业(.sync)- 等待作业完成后再进入下一步。
-
等待回调(.waitForTaskToken)- 暂停工作流,直到外部进程返回任务令牌。
对于首次集成,您将使用请求响应(默认)集成模式。
集成如何工作?
一个 Task 状态代表状态机执行的一个工作单元。您状态机中的所有工作由任务完成。
任务通常通过将输入传递给其他服务的 API 操作来执行工作,然后这些服务执行自己的工作。您可以使用多个字段来指定任务的执行方式,这些字段包括:Credentials、Retry、Catch、TimeoutSeconds 等。您可以在 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 步 - 添加情绪分析状态
-
编辑您的 MyFirstStateMachine 状态机。
-
在状态浏览器的操作面板中搜索
DetectSentiment。 -
将 Comprehend DetectSentiment 拖放到 Choice 状态的默认分支上。
-
选择并删除 Fail 状态。
-
从状态浏览器的流选项卡中,将成功状态拖到 DetectSentiment 之后。
第 4.2 步 - 配置情绪分析状态
-
选择 Comprehend 步骤以在检查器面板中对其进行配置。
-
选择参数和输出选项卡,然后将参数替换为以下 JSON:
{ "LanguageCode": "en", "Text": "{% %}" } -
将光标置于百分号
{% %}之间,然后键入:$ -
在编辑器中使用自动完成功能来选择
states,然后键入
.并选择context,然后键入
.并选择Execution,然后键入
.并选择Input,最后,键入
.feedback_comment以从上下文对象中检索初始输入。
选择这些自动完成选项后,您的状态 Arguments 应该具有以下 JSON:
{ "LanguageCode": "en", "Text": "{% $states.context.Execution.Input.feedback_comment %}" }
使用编辑器自动完成
使用编辑器自动完成功能,您可以探索自己的选项。
自动完成将列出您的变量、包含上下文对象的保留 $states 变量以及可用函数及其定义!
第 4.3 步 - 配置身份策略
在可以运行工作流之前,您需要创建角色和策略以允许状态机对外部服务执行 API 调用。
为 Step Functions 创建 IAM 角色
-
在新选项卡中转到 IAM 控制台,然后选择角色。
-
选择创建新角色。
-
在可信实体类型中,选择
Amazon 服务。 -
在使用案例中,选择
Step Functions。 -
在添加权限中,选择下一步以接受默认策略。创建角色后,您将为 Comprehend 添加策略。
-
在名称中,输入
HelloWorldWorkflowRole。 -
选择创建角色。
为 Amazon Comprehend 将策略添加到 HelloWorldWorkflowRole
-
选择并编辑 HelloWorldWorkflowRole 角色。
-
选择添加权限,然后选择创建内联策略。
-
为服务选择 Comprehend。
-
在读取中,选择 DetectSentiment,然后选择下一步
-
在策略名称中,输入
DetectSentimentPolicy,然后选择创建策略。
如果查看该政策,您会发现该策略允许所有资源执行操作 "comprehend:DetectSentiment"。
将 IAM 角色附加到 Step Functions 状态机
-
返回编辑状态机并选择配置选项卡。
-
从执行角色下拉菜单中选择
HelloWorldWorkflowRole。 -
保存您的状态机。
第 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)服务集成模式。
恭喜您!
您创建了第一个状态机并使用请求响应模式集成了情绪分析任务。
我们非常重视您的反馈!
如果您觉得本入门教程很有帮助,或者您有改进教程的建议,请使用此页面上的反馈选项告诉我们。
清理资源
执行以下步骤来清理您创建的资源:
-
导航到 Amazon 管理控制台中的 Step Functions
页面。 -
从左侧导航窗格中选择状态机。
-
选择 MyFirstStateMachine
-
删除 IAM 角色
1 - 单击 IAM 角色的链接以在新选项卡中转到 IAM 角色页面。删除自定义相关角色。
2 - 在“IAM 角色”中,搜索包含
MyFirstStateMachine的自动生成角色。删除自动生成的角色。 -
返回 Step Functions 控制台选项卡,选择操作下拉列表,然后选择删除以删除状态机。
现在,您的状态机和相关角色应该已成功删除。