本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
了解 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 中使用转换数据。
注意
每个州只能使用一种查询语言。您不能在一个步骤JSONPathJSONata中混合 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。
注意
-
JSON文本格式的数字符合 JavaScript 语义。这些数字通常对应于双精度 IEEE-854 值
。 -
以下是有效的JSON文本:
-
以引号分隔的独立字符串
-
对象
-
数组
-
数字
-
布尔值
-
null
-
-
一个状态的输出成为下一个状态的输入。但是,您可以使用输入和输出处理,将状态限制为处理输入数据的子集。
状态机输入/输出
您可以通过以下两种方式之一将初始输入数据提供给 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:us-east-1: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 与 Express Workflows 集成。使用异步调用时,Step Functions 会暂停工作流执行,直到返回任务令牌。但是,等待任务令牌会使工作流同步。
您可以配置为调用 Step Functions 的服务包括:
-
Amazon Lambda,使用
StartExecution
调用。
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
。
有关更多信息,请参阅下列内容:
-
UpdateStateMachine
在Amazon Step Functions API参考文献中