本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
了解 Step Functions 中的状态机
Step Functions 基于状态机,也称为工作流程。工作流程由一系列事件驱动的步骤组成。
您可以使用 Amazon States 语言(也称为 ASL)定义工作流程。您可以选择使用可视化工作流设计器 Workflow Studio 来构建和编辑您的工作流程。
工作流程中的每个步骤都称为状态。有两种类型的状态:流程状态和任务状态:
- 流量状态
-
流程状态控制步骤的执行流程。例如,选择状态提供条件逻辑;等待状态暂停工作流程执行;地图状态为数据集中的每个项目运行子工作流程;并行状态在工作流程中创建单独的分支。
- 任务状态
-
任务状态代表另一个 Amazon 服务执行的工作单元,例如调用另一个服务 Amazon Web Services 服务 或 API。任务状态也称为操作。您可以选择数百个操作来执行内部 Amazon 和外部服务。(注意:您也可以使用在 Step Functions 之外运行的工作线程来执行任务。 有关更多信息,请参阅活动。)

执行和处理错误
当你运行工作流程时,Step Functions 会创建一个名为执行的工作流程实例。您可以监控工作流程执行的状态。如果执行遇到错误,则工作流程可能会捕获错误。根据您的用例,您可以稍后重新驱动执行以恢复工作流程。
传递数据
您可以选择以 JSON 文本的形式向工作流程提供输入数据。每个步骤都可以使用变量和状态输出将数据传递到后续步骤。存储在变量中的数据可供后续步骤使用。状态输出将成为下一步的输入。要了解有关传递数据的更多信息,请参阅使用变量在状态之间传递数据。
在工作流程结束时,您的状态机可以选择以 JSON 的形式生成输出。
转换数据
状态机和状态机可以使用查询语言转换数据。推荐的查询语言是 JSONata;但是,使用 re: Invent 2024 之前创建的状态机。JSONPath为了向后兼容,您的状态机或各个状态必须选择使用其 JSONata 查询语言。
您可以通过设置为 “JSONata” 的QueryLanguage
字段来识别 JSONata 状态机和单个状态。状态机和使用的 JSONPath状态缺少字QueryLanguage
段。
使用的州 JSONPath 将具有诸如 “参数” InputPath、 ResultSelector ResultPath、和 “” 之类的状态字段 OutputPath。在 JSONPath 状态机定义中,您还将看到以和结尾的字段名称.$
和前缀为$.
和的值$$.
,两者都表示路径。在路径中,您可能会看到各种内部函数,例如。States.MathAdd
内部函数仅用于。 JSONPath
JSONata 各州使用 “参数” 和 “输出” 字段。在这些可选字段中,您可能会看到如下所示的 JSONata 表达式:"{% $type = 'local' %}"
。使用 JSONata,您可以使用表达式、运算符和函数。要了解更多信息,请参阅在 Step Functi JSONata ons 中使用转换数据。
注意
每个州只能使用一种查询语言。你不能 JSONata在单个步骤内混合 JSONPath and。
重要概念
以下内容概述了上下文中的关键 Step Functions 术语。
租期 | 描述 |
---|---|
工作流 | 通常反映业务流程的一系列步骤。 |
状态 |
状态机中的各个步骤,可以根据它们的输入做出决策,根据这些输入执行操作,并将输出传递给其它状态。 有关更多信息,请参阅 探索要在 Step Functions 中使用的工作流程状态。 |
Workflow Studio |
一款可视化工作流设计器,可帮助您更快地进行工作流的原型设计和构建。 有关更多信息,请参阅 在 Step Functions 工作流程工作室中开发工作流程。 |
状态机 | 使用 JSON 文本定义的工作流,该文本表示工作流中的各个状态或步骤以及字段,例如 有关更多信息,请参阅 Amazon States Language 中用于 Step Functions 工作流程的状态机结构。 |
Amazon States Language |
一种基于 JSON 的结构化语言,用于定义状态机。使用 ASL,可以定义状态集合,以便执行工作(Task 状态),确定接下来要转换为哪些状态(Choice 状态),以及在出错的情况下停止执行(Fail 状态)。 有关更多信息,请参阅 使用 Amazon States Language 定义 Step Functions 工作流程。 |
输入与输出配置 |
工作流程中的状态接收 JSON 数据作为输入,并通常将 JSON 数据作为输出传递给下一个状态。Step Functions 提供了筛选条件来控制状态之间的数据流。 有关更多信息,请参阅 在 Step Functions 中处理输入和输出。 |
服务集成 |
您可以从工作流程中调用 Amazon 服务 API 操作。 有关更多信息,请参阅 将服务与 Step Functions 集成。 |
服务集成类型 |
|
服务集成模式 | 调用时 Amazon Web Services 服务,您可以使用以下服务集成模式之一:
|
Execution |
状态机执行是指运行工作流执行任务的实例。 有关更多信息,请参阅 在 Step Functions 中启动状态机执行。 |
状态机数据
状态机数据采用以下形式:
-
状态机的初始输入
-
在状态之间传递的数据
-
状态机的输出
此部分介绍在 Amazon Step Functions中状态机数据的格式及如何使用。
数据格式
状态机数据由 JSON 文本表示。您可以使用 JSON 支持的任何数据类型向状态机提供值。
注意
状态机输入/输出
您可以通过以下两种方式之一将初始输入数据提供给 Amazon Step Functions 状态机。开始执行时,可以将数据传递给一个 StartExecution
操作。您也可以从 Step Functions 控制台StartAt
状态。如果未提供输入,默认值为空对象 ({}
)。
执行的输出由最后一个状态 (terminal
) 返回。此输出以 JSON 文本形式显示在执行结果中。
对于标准工作流,您可以使用外部调用方(例如,在 DescribeExecution
操作中),从执行历史记录中检索执行结果。您可以在 Step Functions 控制台
对于 Express Workflows,如果您启用了日志记录,则可以从 CloudWatch 日志中检索结果,或者在 Step Functions 控制台中查看和调试执行。有关更多信息,请参阅在 Step Functions 中使用 CloudWatch 日志记录执行历史记录和在 Step Functions 控制台中查看执行详细信息。
您还应该考虑与状态机相关的配额。有关更多信息,请参阅 Step Functions 服务配额。
状态输入/输出
每个状态的输入包含来自前一个状态的 JSON 文本,对于 StartAt
状态来说,是对执行的输入。某些流控制状态的输出与输入相同。
在以下示例中,状态机将两个数字加到一起。
-
定义 Amazon Lambda 函数。
function Add(input) { var numbers = JSON.parse(input).numbers; var total = numbers.reduce( function(previousValue, currentValue, index, array) { return previousValue + currentValue; }); return JSON.stringify({ result: total }); }
-
定义状态机。
{ "Comment": "An example that adds two numbers together.", "StartAt": "Add", "Version": "1.0", "TimeoutSeconds": 10, "States": { "Add": { "Type": "Task", "Resource": "arn:aws:lambda:
region
:123456789012:function:Add", "End": true } } } -
使用以下 JSON 文本开始执行。
{ "numbers": [3, 4] }
Add
状态接收 JSON 文本并将其传递到 Lambda 函数Lambda 函数将计算结果返回给状态。
状态在其输出中返回以下值。
{ "result": 7 }
由于
Add
还是状态机中的最后一个状态,此值作为状态机的输出返回。如果最后一个状态未返回输出,则状态机返回空对象 (
{}
)。
有关更多信息,请参阅 在 Step Functions 中处理输入和输出。
Amazon Step Functions 从其他服务调用
您可以配置其他几个服务来调用状态机。根据状态机的工作流类型,您可以异步或同步调用状态机。要同步调用状态机,请使用 StartSyncExecution
API 调用或 Amazon API Gateway 与快速工作流集成。使用异步调用时,Step Functions 会暂停工作流执行,直到返回任务令牌。但是,等待任务令牌会使工作流同步。
您可以配置为调用 Step Functions 的服务包括:
Step Functions 调用受 StartExecution
配额的约束。有关更多信息,请参阅:
状态机中的转换
在启动状态机的新执行时,系统以在顶级 StartAt
字段中引用的状态开始。此字段为字符串形式,必须完全匹配工作流中某个状态的名称,并且区分大小写。
状态运行后, Amazon Step Functions 使用该Next
字段的值来确定要进入的下一个状态。
Next
字段还将状态名称指定为字符串。此字符串区分大小写,并且必须完全匹配状态机定义中指定的状态名称。
例如,以下状态包括到 NextState
的转换。
"SomeState" : {
...,
"Next" : "NextState"
}
大部分状态只允许使用具有 Next
字段的一个转换规则。不过,某些流控制状态(例如,Choice
状态)允许您指定多个转换规则,每个具有各自的 Next
字段。Amazon States Language 提供有关您可指定的各个状态类型的详细信息,包括如何指定转换的信息。
状态可以有多个来自其他状态的传入转换。
该过程重复,直至到达最终状态 ("Type":
Succeed
、"Type": Fail
或 "End": true
状态) 或者出现运行时错误。
当您 时redrive一次执行,它被视为状态转换。此外,所有在 a 中重新运行的状态 redrive 也被视为状态转换。
以下规则适用于状态机中的状态:
-
状态在封闭块中可以按任意顺序出现。但是,它们列出的顺序不会影响到它们的运行顺序。运行顺序由状态的内容决定。
-
在状态机中,只能有一个状态指定为
start
状态。start
状态由顶级结构中StartAt
字段的值定义。 -
根据您的状态机逻辑,您可能会有多个
end
状态 (例如状态机有多个逻辑分支时)。 -
如果状态机只包含一个状态,该状态可以为 start 状态和 end 状态。
Step Functions 中的读取一致性
中的状态机更新最终是一致 Amazon Step Functions 的。几秒钟内的所有 StartExecution
调用都将使用更新后的定义和 roleArn
(IAM 角色的 Amazon 资源名称)。但在调用 UpdateStateMachine
后立即启动的执行可能会使用以前的状态机定义和 roleArn
。
有关更多信息,请参阅下列内容:
-
《Amazon Step Functions API 参考》中的
UpdateStateMachine