

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 了解 Step Functions 中的状态机
<a name="concepts-statemachines"></a>

Step Functions 基于*状态机*，也称为*工作流*。工作流由一系列事件驱动的步骤组成。

您可以使用 Amazon States Language（也称为 ASL）定义工作流。您可以选择使用可视化工作流设计器 Workflow Studio 来构建和编辑您的工作流。

工作流程中的每个步骤都称为*状态*。共有两种类型的状态：流状态和任务状态：

**流状态**  
 流状态控制步骤的执行流。例如，**Choice 状态**提供条件逻辑；**Wait 状态**暂停工作流执行；**Map 状态**为数据集中的每个项目运行子工作流；**Parallel 状态**在工作流中创建单独的分支。

**Task 状态**  
任务状态代表另一个 AWS 服务执行的工作单元，例如调用另一个服务 AWS 服务 或 API。Task 状态也称为**操作**。您可以选择数百个操作来执行内部 AWS 和外部服务。（注意：您也可以使用在 Step Functions 之外运行的工作线程来执行任务。有关更多信息，请参阅[活动](concepts-activities.md)。）

![\[Step Functions 工作流组件的说明性示例。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/state-machine-conceptual-jsonata.png)


**执行和处理错误**

当您运行工作流时，Step Functions 会创建一个名为*执行*的工作流实例。您可以监控工作流执行的状态。如果执行遇到错误，工作流可能会捕获错误。根据您的使用案例，您可能会在以后重新启动执行以恢复工作流。

**传递数据**

您可以选择以 JSON 文本的形式向工作流提供**输入数据**。每个**步骤**都可以使用变量和状态输出将数据传递到后续步骤。存储在变量中的数据可供后续步骤使用。状态输出成为下一步的输入。要了解有关传递数据的更多信息，请参阅[使用变量在状态之间传递数据](workflow-variables.md)。

在工作流结束时，您的状态机也可以选择以 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 中使用转换数据](transforming-data.md)。

**注意**  
您仅可为每个状态使用一种查询语言。您不能在一个步骤 JSONPath JSONata中混合 and。

## 重要概念
<a name="key-concepts-get-started"></a>



以下内容概述了上下文中的关键 Step Functions 术语。




| 租期 | 说明 | 
| --- | --- | 
| 工作流 | 通常反映业务流程的一系列步骤。 | 
| 状态 |  状态机中的各个步骤，可以根据它们的输入做出决策，根据这些输入执行操作，并将输出传递给其它状态。 有关更多信息，请参阅 [探索要在 Step Functions 中使用的工作流程状态](workflow-states.md)。  | 
| Workflow Studio |  一款可视化工作流设计器，可帮助您更快地进行工作流的原型设计和构建。 有关更多信息，请参阅 [在 Step Functions 工作流程工作室中开发工作流程](workflow-studio.md)。  | 
| 状态机 | 使用 JSON 文本定义的工作流，该文本表示工作流中的各个状态或步骤以及字段，例如 `StartAt`、`TimeoutSeconds` 和 `Version`。 有关更多信息，请参阅 [Amazon States Language 中用于 Step Functions 工作流程的状态机结构](statemachine-structure.md)。 | 
| Amazon States Language |   一种基于 JSON 的结构化语言，用于定义状态机。使用 ASL，可以定义[状态](workflow-states.md)集合，以便执行工作（[`Task` 状态](state-task.md)），确定接下来要转换为哪些状态（[`Choice` 状态](state-choice.md)），以及在出错的情况下停止执行（[`Fail` 状态](state-fail.md)）。 有关更多信息，请参阅 [使用 Amazon States Language 定义 Step Functions 工作流程](concepts-amazon-states-language.md)。  | 
| 输入与输出配置 |  工作流程中的状态接收 JSON 数据作为输入，并通常将 JSON 数据作为输出传递给下一个状态。Step Functions 提供了筛选条件来控制状态之间的数据流。 有关更多信息，请参阅 [在 Step Functions 中处理输入和输出](concepts-input-output-filtering.md)。  | 
| 服务集成 |  您可以从工作流程中调用 AWS 服务 API 操作。 有关更多信息，请参阅 [将服务与 Step Functions 集成](integrate-services.md)。 | 
| 服务集成类型 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/concepts-statemachines.html)  | 
| 服务集成模式 | 调用时 AWS 服务，您可以使用以下服务集成模式之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/concepts-statemachines.html)  | 
| Execution |  状态机执行是指运行工作流执行任务的实例。  有关更多信息，请参阅 [在 Step Functions 中启动状态机执行](statemachine-starting.md)。 | 

## 状态机数据
<a name="concepts-state-machine-data"></a>

状态机数据采用以下形式：
+ 状态机的初始输入
+ 在状态之间传递的数据
+ 状态机的输出

此部分介绍在 AWS Step Functions中状态机数据的格式及如何使用。

**Topics**
+ [数据格式](#concepts-state-machine-data-format)
+ [状态机输入/输出](#concepts-state-machine-data-state-machine-input-output)
+ [状态输入/输出](#concepts-state-machine-data-state-input-output)

### 数据格式
<a name="concepts-state-machine-data-format"></a>

状态机数据由 JSON 文本表示。您可以使用 JSON 支持的任何数据类型向状态机提供值。

**注意**  
JSON 文本格式的数字符合 JavaScript 语义。这些数字通常对应于双精度 [IEEE-854](https://standards.ieee.org/findstds/standard/854-1987.html) 值。
以下是有效的 JSON 文本：  
以引号分隔的独立字符串
对象
数组
数字
布尔值
`null`
一个状态的输出成为下一个状态的输入。但是，您可以使用[输入和输出处理](concepts-input-output-filtering.md)，将状态限制为处理输入数据的子集。

### 状态机输入/输出
<a name="concepts-state-machine-data-state-machine-input-output"></a>

您可以通过以下两种方式之一将初始输入数据提供给 AWS Step Functions 状态机。开始执行时，可以将数据传递给一个 `[StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)` 操作。您也可以从 [Step Functions 控制台](https://console.aws.amazon.com/states/home?region=us-east-1#/)将数据传递到状态机。初始数据传递到状态机的 `StartAt` 状态。如果未提供输入，默认值为空对象 (`{}`)。

执行的输出由最后一个状态 (`terminal`) 返回。此输出以 JSON 文本形式显示在执行结果中。

对于标准工作流，您可以使用外部调用方（例如，在 `[DescribeExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeExecution.html)` 操作中），从执行历史记录中检索执行结果。您可以在 [Step Functions 控制台](https://console.aws.amazon.com/states/home?region=us-east-1#/)上查看执行结果。

对于 Express Workflows，如果您启用了日志记录，则可以从 CloudWatch 日志中检索结果，或者在 Step Functions 控制台中查看和调试执行。有关更多信息，请参阅[在 Step Functions 中使用 CloudWatch 日志记录执行历史记录](cw-logs.md)和[在 Step Functions 控制台中查看执行详细信息](concepts-view-execution-details.md)。

您还应该考虑与状态机相关的配额。有关更多信息，请参阅 [Step Functions 服务配额](service-quotas.md)。

### 状态输入/输出
<a name="concepts-state-machine-data-state-input-output"></a>

每个状态的输入包含来自前一个状态的 JSON 文本，对于 `StartAt` 状态来说，是对执行的输入。某些流控制状态的输出与输入相同。

在以下示例中，状态机将两个数字加到一起。

1. 定义 AWS 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 });
   }
   ```

1. 定义状态机。

   ```
   {
     "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
           }
       }
   }
   ```

1. 使用以下 JSON 文本开始执行。

   ```
   { "numbers": [3, 4] }
   ```

   `Add` 状态接收 JSON 文本并将其传递到 Lambda 函数

   Lambda 函数将计算结果返回给状态。

   状态在其输出中返回以下值。

   ```
   { "result": 7 }
   ```

   由于 `Add` 还是状态机中的最后一个状态，此值作为状态机的输出返回。

   如果最后一个状态未返回输出，则状态机返回空对象 (`{}`)。

有关更多信息，请参阅 [在 Step Functions 中处理输入和输出](concepts-input-output-filtering.md)。

## AWS Step Functions 从其他服务调用
<a name="concepts-invoke-sfn"></a>

您可以配置其他几个服务来调用状态机。根据状态机的[工作流类型](choosing-workflow-type.md)，您可以异步或同步调用状态机。要同步调用状态机，请使用 `[StartSyncExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartSyncExecution.html)` API 调用或 Amazon API Gateway 与快速工作流集成。使用异步调用时，Step Functions 会暂停工作流执行，直到返回任务令牌。但是，等待任务令牌会使工作流同步。

您可以配置为调用 Step Functions 的服务包括：
+  AWS Lambda，使用 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) 调用。
+  [Amazon API Gateway](https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-api-gateway.html) 
+  [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/create-eventbridge-rule.html) 
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-StepFunctions.html) 
+  [AWS IoT 规则引擎](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html) 
+  [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/connect-stepfunctions.html) 

Step Functions 调用受 `StartExecution` 配额的约束。有关更多信息，请参阅:
+ [Step Functions 服务配额](service-quotas.md)

## 状态机中的转换
<a name="concepts-transitions"></a>

在启动状态机的新执行时，系统以在顶级 `StartAt` 字段中引用的状态开始。此字段为字符串形式，必须完全匹配工作流中某个状态的名称，并且区分大小写。

状态运行后， AWS Step Functions 使用该`Next`字段的值来确定要进入的下一个状态。

 `Next` 字段还将状态名称指定为字符串。此字符串区分大小写，并且必须完全匹配状态机定义中指定的状态名称。

例如，以下状态包括到 `NextState` 的转换。

```
"SomeState" : {
  ...,
  "Next" : "NextState"
}
```

大部分状态只允许使用具有 `Next` 字段的一个转换规则。不过，某些流控制状态（例如，`Choice` 状态）允许您指定多个转换规则，每个具有各自的 `Next` 字段。[Amazon States Language](concepts-amazon-states-language.md) 提供有关您可指定的各个状态类型的详细信息，包括如何指定转换的信息。

状态可以有多个来自其他状态的传入转换。

该过程重复，直至到达最终状态 (`"Type": Succeed`、`"Type": Fail` 或 `"End": true` 状态) 或者出现运行时错误。

当您[redrive](redrive-executions.md)执行时，则视为一种状态转换。此外，在redrive中重新运行的所有状态也视为状态转换。

以下规则适用于状态机中的状态：
+ 状态在封闭块中可以按任意顺序出现。但是，它们列出的顺序不会影响到它们的运行顺序。运行顺序由状态的内容决定。
+ 在状态机中，只能有一个状态指定为 `start` 状态。`start` 状态由顶级结构中 `StartAt` 字段的值定义。
+ 根据您的状态机逻辑，您可能会有多个 `end` 状态 (例如状态机有多个逻辑分支时)。
+ 如果状态机只包含一个状态，该状态可以为 start 状态和 end 状态。

### 分布式 Map 状态下的转换
<a name="dist-map-transitions"></a>

当您在分布式模式下使用 `Map` 状态时，对于*分布式 Map 状态* 启动的每个子工作流执行，都会收取一次状态转换的费用。当您在内联模式下使用 `Map` 状态时，您无需为*内联 Map 状态* 的每次迭代支付状态转换费用。

您可以在分布式模式下使用 `Map` 状态，并在 `Map` 状态定义中包含嵌套工作流，进而优化成本。当您启动**快速**类型的子工作流执行时，*分布式 Map 状态*还会增加更多价值。Step Functions 存储 Express 子工作流程执行的响应和状态，从而减少了在 CloudWatch 日志中存储执行数据的需求。您还可以访问*分布式 Map 状态* 下的可用流量控制，例如定义错误阈值或批处理一组项目。有关 Step Functions 定价的信息，请参阅 [AWS Step Functions 定价](https://aws.amazon.com/step-functions/pricing/)。

## Step Functions 中的读取一致性
<a name="concepts-read-consistency"></a>

中的状态机更新最终是一致 AWS Step Functions 的。几秒钟内的所有 `StartExecution` 调用都将使用更新后的定义和 `roleArn`（IAM 角色的 Amazon 资源名称）。但在调用 `UpdateStateMachine` 后立即启动的执行可能会使用以前的状态机定义和 `roleArn`。

有关更多信息，请参阅下列内容：
+ **《AWS Step Functions API 参考》中的 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_UpdateStateMachine.html)