本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
了解如何开始使用 Step Functions
借助 Step Functions 服务,您可以协调复杂的应用程序工作流程。首先,您将使用 Workflow Studio 创建和运行内置的 Hello World 工作流程。你将在代码中查看自动生成的 Amazon States Language (ASL) 定义。最后,您将 drag-and-drop通过服务集成来进行情绪分析。
完成本教程后,您将知道如何使用 Workflow Studio 使用设计和代码模式创建、配置、运行和更新工作流程。
预计持续时间:20-30 分钟
你要建造什么
您的第一台状态机将从流程状态开始。流程状态用于指导和控制您的工作流程。在您学习如何运行工作流程后,您将添加一个操作,将 Amazon Comprehend 服务与任务状态集成。
下图显示了您将要构建的完整状态机的视觉效果。首次创建 Hello World 状态机时,它不需要额外的资源即可运行。Step Functions 控制台只需单击一下即可创建所有状态和IAM角色。稍后,当您添加服务集成时,您将需要创建一个具有自定义权限策略的角色。
第 1 步-创建您的状态机
在 Step Functions 中,工作流被称为状态机。我们将两个术语交替使用。您的工作流程将包含执行操作或控制状态机流的状态。
-
前往 Ste p Functions 控制台。
-
在 Step Functions 控制台中,从左上角的导航栏中选择 “Step Fun ctions”,或者从导航栏中选择 “Step Functions”,然后选择开始:
-
从选项中选择 Run Hello World:
提示
为了熟悉用户界面,我们建议您逐步完成控制台中的简短演练。
工作流工作室概述
使用适用于 Step Functions 的 Workflow Studio,你可以在画布上直观地 drag-and-drop声明以构建工作流程。
您可以添加和编辑状态、配置步骤、转换结果以及设置错误处理。以下屏幕截图显示了用于构建状态机的界面的四个重要区域。
模式-Workflow Studio 提供三种操作模式,默认为视觉设计模式。
-
设计-一种可视化编辑模式,您可以在其中将 drag-and-drop状态置于工作流程中。
-
代码-一种侧重于 Amazon States 语言代码(也称为ASL代码)的模式。您可以直接编辑ASL代码并查看视觉设计中反映的更改。
-
Config-配置选项,包括状态机的名称和类型(标准或快速)、工作流程运行时分配的角色、记录、跟踪、版本控制、加密和标签。
状态浏览器包含以下三个选项卡:
-
操作-您可以 drag-and-drop进入工作流程 AWS APIs的操作列表。每个操作都代表一种任务工作流状态。
-
Flo@@ w-用于控制工作流程中步骤顺序的流程状态。
-
模式- ready-to-use,可重复使用的构建块,例如迭代处理 Amazon S3 存储桶中的数据。
画布和工作流程图是你在工作流程图上显示 drag-and-drop状态、更改状态顺序以及选择要配置和测试的状态的地方。
Inspector 面板用于查看和编辑画布上任何选定状态的属性。您可以打开 “定义” 开关以显示当前所选状态的代码。
状态机概述
Hello World 工作流程从一个 Pass 状态开始,该状态会将其输入传递到其输出,而不执行任何工作。在将数据传递到下一个状态之前,可以使用传递状态生成静态JSON输出或转换JSON输入。在构造和调试状态机时,传递状态很有用。
下一个状态,即选择状态,使用中的数据IsHelloWorldExample
来选择工作流的下一个分支。如果第一条规则匹配,则工作流将在 “等待” 状态下暂停,然后以 “并行” 状态运行两个任务,然后进入检查点并成功结束工作流程。如果没有匹配项,则在停止状态机之前,工作流会默认为 “失败” 状态。
当你想在执行更多工作之前延迟时,等待状态可能很有用。也许您的工作流程会在输入订单后等待 30 秒,因此您的客户有时间注意到并修复错误的配送地址。
并行状态可以对您的数据运行多个进程。也许工作流程会同时打印订单单、更新库存和增加每日销售报告。
查看工作流程代码 (ASL)
实际上,您的第一台状态机非常详细,因此请通过查看代码进一步探索。
状态机是使用 Amazon States Language (ASL)
查看整个状态机定义
-
选择 {} 代码按钮查看ASL代码。
-
查看左边的代码,并与右边的状态机图进行比较。
-
在画布上选择一些州进行查看。例如,选择 “选择” 状态。
您是否注意到代码视图中状态的定义是如何突出显示的?
在 Inspector 中查看代码
-
切换回设计模式。
-
展开右侧的 Inspector 面板。
-
从画布上的工作流程图表中选择 “选择” 状态。
-
在 Inspector 面板中,选择 “定义” 开关。
尝试选择其他州。看看你选择的每个状态的ASL代码是如何滚动到视图中并突出显示的?
(实际上)创建状态机
警告:现在就给你的状态机起名字!
创建状态机后,您无法对其进行重命名。在保存状态机之前选择一个名称。
到目前为止,你一直在研究状态机的草稿。尚未创建任何资源。
重命名和创建状态机
-
选择 Config 模式。
-
对于状态机名称,请输入
MyFirstStateMachine
-
要获得权限,请接受默认的 “创建新角色”。
-
选择 “创建” 按钮以实际创建状态机。
您应该会看到状态机和新IAM角色已创建的通知。
系统将自动显示启动状态机的选项。你将在下一步中这样做!
工作流程创建完成!
Step Functions 创建了你的工作流程和IAM角色。现在,您已准备好启动状态机了。
第 2 步-启动状态机
创建状态机后,即可开始运行工作流程。
工作流可以选择使用可在状态下使用的输入,发送到集成服务,然后传递到下一个状态。
Hello World 状态机是独立的,不需要输入。
启动状态机
-
输入
hello001
执行的名称。 -
将输入字段留空。
-
选择 “开始执行” 按钮。
查看执行细节
启动后,你应该会立即看到前两个状态都成功了。
稍等片刻后,其余的状态转换将运行以完成工作流程。
你想知道 Choice 的状态如何(Hello World Example 吗? ) 决定分支到 “等待 X 秒” 状态?
-
提示:状态机的第一步包含分支决策所需的数据
-
在 Graph View 中,您可以监控执行过程中的进度并浏览每种状态的详细信息。
-
选择第一个通过状态(名为 “设置变量” 和 “状态输出”),然后查看 “输入/输出” 选项卡。
您应该看到 State 输入为空,但是 State 输出JSON包含将的值设置IsHelloWorldExample
为true
。
从图表视图切换到表格视图,按名称、类型和状态查看状态列表。
提示
请注意上一个屏幕截图中的 “持续时间” 和 “时间表” 字段。一目了然,你可以看到哪些州比其他州花费更多的时间。
此处决详情页面上还有两个视图可供探索:事件视图和状态视图。
事件视图是从一个州到另一个州的流程的详细粒度视图。
展开 “PassStateExited事件视图” 表中的第一个PassStateEntered和事件,以查看该状态如何不接受任何输入,分配一个名CheckpointCount
为零值的变量,并生成您之前看到的输出。
最后,状态视图类似于表格视图。在状态视图表中,您可以有选择地展开状态以仅查看每种状态的输入和输出:
恭喜您!你已经运行了第一台 Step Functions 状态机!
使用 “通过” 状态将静态数据添加到工作流程是一种常见的模式,尤其是在故障排除方面。
在下一步中,您将更新工作流程,以便动态设置状态机输入。
步骤 3-处理外部输入
在工作流程中IsHelloWorldExample
将的值设置为恒定值是不现实的。你应该期望你的状态机对不同的输入数据做出响应。
在此步骤中,我们将向您展示如何使用外部JSON数据作为工作流程的输入:
移除硬编码的输入
首先,替换 “第一次通过” 状态的 “输出” 中的硬编码值。
-
选择页面右上角的编辑状态机按钮,编辑你的 Hello World 状态机。
-
选择 “开始” 之后的第一个 “通过” 状态(名为 “设置变量和状态输出”),然后选择 “输出” 选项卡。
-
将输出替换为以下内容JSON:
{ "IsHelloWorldExample": "{% $states.input.hello_world %}", "ExecutionWaitTimeInSeconds": "{% $states.input.wait %}" }
-
保存状态机。
更新后的状态输出将使用JSONata表达式从保留的 $ states 变量中提取输入数据。这些值将作为输出传递到下一个状态,成为下一个状态的输入。
使用输入数据运行更新的工作流程
接下来,运行工作流程并提供外部输入数据JSON。
-
选择 “执行” 按钮以运行工作流程。
-
对于名称,请使用随机生成的 ID。
-
在输入字段中使用以下内容JSON:
{ "wait" : 20, "hello_world": true }
-
选择 “开始执行” 按钮。
你的状态机执行应该等待更长的时间(20 秒),但使用你提供的输入,它最终应该会成功。
在图表视图中,查看第一个通过状态的输入/输出。请注意您提供的输入是如何转换为输出的。另外,请查看执行详情页面顶部的执行输入和输出。这两个位置都显示了您用来开始执行的输入。
提示
如果你在 hello_wor ld 设置为 false 的情况下运行新的执行任务,你会期待什么? 试试看!
查看工作流程执行情况
现在,您已经运行了几次工作流程,请查看执行细节以查看工作流程的运行情况。
查看执行细节
-
从导航栏导航栏或左侧菜单中选择 State 机器。
-
选择状态机。
在 “执行” 选项卡中,您应该会看到一个执行列表,类似于以下屏幕截图:
最后一点:工作流程执行名称必须是唯一的,并且不能重复使用。尽管我们在本教程中建议使用短名称 (hello001
),但我们建议使用对您的生产工作负载来说始终是独一无二的命名约定。
提示
恭喜您!您已修改工作流程以处理每次运行工作流程时可能不同的外部输入。
第 4 步-集成服务
Step Functions 状态机可以使用AWS SDK集成调用 220 多种 AWS 服务。 AWS 服务为您的状态机提供超过 10,000 个潜在API操作。
在此步骤中,您将集成用于情绪分析的 Amazon Comprehend 任务,以处理您的状态机输入。
服务集成使用三种服务集成模式之一:
-
请求响应(默认)-等待HTTP响应,然后立即进入下一个状态。
-
运行 Job (.sync)-等待任务完成后再进入下一步。
-
等待回电 (. waitForTaskToken)-暂停工作流程,直到外部进程返回任务令牌。
对于首次集成,您将使用请求响应(默认)集成模式。
集成是如何运作的?
任务状态表示状态机执行的单个工作单元。您状态机中的所有工作由任务 完成。
任务通常通过将输入传递给其他服务的API操作来执行工作,然后这些服务执行自己的工作。您可以使用多个字段来指定任务的执行方式,包括:Credentials
Retry
、Catch
、TimeoutSeconds
、等。您可以在中了解有关任务的更多信息Task 工作流程状态。
要使用 AWS SDK集成,请指定服务名称API并调用。有些集成还需要参数。
您可以使用 Amazon States 语言在任务状态的 “资源” 字段中指定 AWS 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
。 -
将 Comp DetectSentiment rehend 拖放到 “选择” 状态的 “默认” 分支上。
-
选择并删除 “失败” 状态。
-
从 “状态” 浏览器的 “流程” 选项卡中,将 “成功” 状态拖到后面DetectSentiment。
步骤 4.2-配置情绪分析状态
-
选择 Comprehend 步骤以在 Inspector 面板中对其进行配置。
-
选择 “参数和输出” 选项卡,然后将参数替换为以下内容JSON:
{ "LanguageCode": "en", "Text": "{% %}" }
-
将光标放在百分号:之间,
{% %}
然后键入:$
-
在编辑器中使用自动完成功能进行选择
states
,然后键入
.
并选择context
,然后键入
.
并选择Execution
,然后键入
.
并选择Input
,最后,键入
.feedback_comment
以从上下文对象中检索初始输入。
选择这些自动完成选项后,您的状态参数应如下JSON所示:
{ "LanguageCode": "en", "Text": "{% $states.context.Execution.Input.feedback_comment %}" }
使用编辑器自动完成
使用编辑器自动完成功能,您可以探索自己的选项。
自动完成将列出你的变量、包含上下文对象的保留的 $ states 变量以及带有其定义的可用函数!
步骤 4.3-配置身份策略
在运行工作流程之前,您需要创建角色和策略以允许状态机对外部服务进行API调用。
为 Step Fun IAM ctions 创建角色
-
在新选项卡中进入IAM控制台,然后选择 “角色”。
-
选择 Create a new role。
-
对于可信实体类型,请选择
AWS Service
。 -
对于用例,请选择
Step Functions
。 -
对于添加权限,选择下一步以接受默认策略。创建角色后,您将为 Comprehend 添加策略。
-
对于名称,请输入
HelloWorldWorkflowRole
。 -
选择 Create role(创建角色)。
向亚马逊添加政策 Comp HelloWorldWorkflowRolerehend
-
选择并编辑HelloWorldWorkflowRole角色。
-
选择添加权限,然后选择创建内联策略。
-
为该服务选择 Comprehend。
-
在 “阅读” 中选择 DetectSentiment,然后选择 “下一步”
-
在策略名称中输入
DetectSentimentPolicy
,然后输入创建策略。您应该创建类似于以下内容的策略:JSON{ "Version": "2012-10-17", "Statement": [ { "Action": [ "comprehend:DetectSentiment" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
将 a IAM 角色附加到 Step Functions 状态机
-
返回编辑状态机并选择 Config 选项卡。
-
从 “执行角色” 下拉列表中选择
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::123456789012: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-情绪。
考虑请求响应集成的一种方法是,响应通常仅表示对请求的确认。但是,在某些集成中,例如情感分析,确认实际上代表任务的完成。
关键的学习是,在请求响应集成中,Task
状态不会等待底层作业。要等待响应,你需要探索 Run a Job (.sync) 服务集成模式。
恭喜您!
您创建了第一台状态机,并使用请求响应模式集成了情绪分析任务。
清理资源
执行以下步骤来清理您创建的资源:
-
导航到 AWS 控制台中的 Step F
unctions 页面。 -
从左侧的导航窗格中选择 Stat e machines。
-
选择 MyFirstStateMachine
-
删除IAM角色
1-点击IAM角色链接进入新选项卡中的IAM角色页面。删除自定义相关角色。
2-在 “IAM角色” 中,搜索包含
MyFirstStateMachine
自动生成的角色。删除自动生成的角色。 -
返回 Step Functions 控制台选项卡,选择操作下拉列表,然后选择删除以删除状态机。
现在,您的状态机和相关角色应该已成功删除。