

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

# 了解如何开始使用 Step Functions
<a name="getting-started"></a>

借助 Step Functions 服务，您可以编排复杂的应用程序工作流。首先，您将使用 Workflow Studio 创建和运行内置的 **Hello World** 工作流。您将在代码中检查自动生成的 [Amazon States Language](concepts-amazon-states-language.md)（ASL）定义。最后，您将 drag-and-drop通过服务集成来进行情绪分析。

完成本教程后，您将知道如何使用 Workflow Studio 在**设计**和**代码**模式下创建、配置、运行和更新工作流。

预计持续时间：**20-30 分钟**

## 您要构建什么
<a name="what-you-will-build"></a>

您的第一个状态机将从*流状态*开始。流状态用于指导和控制您的工作流。在您了解如何运行工作流后，即可添加**操作**，以便将 Amazon Comprehend 服务与 **Task 状态**集成。

下图显示了您将要构建的完整状态机的可视化示意图。首次创建 Hello World 状态机时，不需要额外的资源即可运行。只需单击一下即可在 Step Functions 控制台中创建所有状态和 IAM 角色。稍后，当您添加服务集成时，您将需要创建一个具有自定义权限策略的角色。

![\[Hello World 工作流的可视化表示。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello-world-arch.png)


## 第 1 步 – 创建状态机
<a name="step-1-create-your-state-machine"></a>

 在 Step Functions 中，*工作流*称为**状态机**。我们将这两个术语互换使用。工作流将包含*状态*，用于**执行操作**或**控制状态机的流**。

1. 转至 **Step Functions 控制台**。

1. 在 Step Functions 控制台中，从左上角的导航栏或面包屑导航中选择“**Step Functions**”，然后选择**开始使用**：  
![\[说明性屏幕截图，显示了如何开始使用 Hello World 工作流\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/get-started-hello-world.png)

1. 从选项中选择**运行 Hello World**：  
![\[说明性屏幕截图，显示了如何选择 Hello World 工作流\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/create-hello-world.png)

**提示**  
为了熟悉用户界面，我们建议您逐步完成控制台中的简短演练。

### Workflow Studio 概览
<a name="overview-of-workflow-studio"></a>

 使用适用于 Step Functions 的 Workflow Studio，你可以在画布上直观地 drag-and-drop声明以构建工作流程。

 您可以添加和编辑状态、配置步骤、转换结果以及设置错误处理。以下屏幕截图显示了用于构建状态机的界面的四个重要区域。

![\[Workflow Studio 界面四个重要区域的说明性屏幕截图\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/wfs-panel-overview.png)


**模式** - Workflow Studio 提供三种操作模式，默认为视觉设计模式。
+ **设计**-一种可视化编辑模式，您可以在其中将 drag-and-drop状态置于工作流程中。
+ **代码** - 一种侧重于 Amazon States Language 代码（也称为 ASL 代码）的模式。您可以直接编辑 ASL 代码并查看视觉设计中反映的更改。
+ **配置** - 配置选项，包括状态机的名称和类型（标准或快速）、工作流运行时分配的角色、日志记录、跟踪、版本控制、加密和标签。

 **状态浏览器**包含以下三个选项卡：
+ **操作**-您可以 drag-and-drop进入工作流程AWSAPIs 的操作列表。每个操作都代表一个 Task 工作流状态。
+ **流** - 用于控制工作流中步骤顺序的流状态。
+ **模式**- ready-to-use，可重复使用的构建块，例如迭代处理 Amazon S3 存储桶中的数据。

 **画布和工作流程图**是你在工作流程图上显示 drag-and-drop状态、更改状态顺序以及选择要配置和测试的状态的地方。

 在**检查器面板**中，您可以查看和编辑画布上所选的任何状态的属性。您可以打开*定义*开关以显示当前所选状态的代码。

### 状态机概述
<a name="overview-of-the-state-machine"></a>

 Hello World 工作流从 **Pass 状态**开始，该状态会将其输入*传递*到其输出，而无需执行工作。Pass 状态可用于生成静态 JSON 输出或转换 JSON 输入，然后再将数据传递到下一个状态。Pass 状态在构造和调试状态机时非常有用。

 下一个状态（即 **Choice 状态**），使用 `IsHelloWorldExample` 中的数据来选择工作流的下一个分支。如果第一条规则匹配，则工作流将在 **Wait 状态**下暂停，然后以 **Parallel 状态**运行两个任务，然后进入检查点并成功结束工作流。如果没有匹配项，则在停止状态机之前，工作流会默认处于 **Fail 状态**。

 如果您希望在执行更多工作之前先暂停一段时间，Wait 状态会很有用。也许您的工作流会在订单录入后等待 30 秒，因此您的客户有时间注意到并修复错误的配送地址。

 Parallel 状态可以对您的数据运行多个进程。也许工作流会同时打印订单凭据、更新库存和增加每日销售报告。

![\[开始实验 Hello World 工作流的说明性图片\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/workflow-1-hello-world.png)


### 查看工作流代码（ASL）
<a name="view-the-code"></a>

 实际上，您的第一个状态机非常详细，因此请查看代码以进一步探索。

 状态机是使用 [Amazon States Language（ASL）](https://states-language.net/)来定义的，这是一种开源规范，它定义了一种基于 JSON 的语言，用于以声明式方式描述状态机。

**查看整个状态机定义**

1. 选择 **\$1 \$1 Code** 按钮来查看 ASL 代码。

1. 查看左边的代码，并与右边的状态机图进行比较。

1. 在画布上选择一些状态进行检查。例如，选择 **Choice 状态**。

![\[代码视图的说明性图片\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello-code-view.png)


 您是否注意到，该状态的定义已在代码视图中突出显示？ 

**在检查器中查看代码**

1. 切换回**设计**模式。

1. 展开右侧的**检查器面板**。

1. 从画布上的工作流图中选择 **Choice 状态**。

1. 在**检查器**面板中，选择**定义**开关。

 尝试选择其他状态。看看您选择的每个状态的 ASL 代码是如何滚动到视图中并突出显示的？ 

### （实际上）创建状态机
<a name="actually-create-the-state-machine"></a>

**警告：立即为您的状态机命名！**  
创建状态机后，您**无法对其进行重命名**。在保存状态机**之前**选择一个名称。

 到目前为止，您一直在编辑状态机的草稿版本。尚未创建任何资源。

 **重命名和创建状态机** 

1. 选择**配置模式**。

1. 对于状态机名称，请输入 `MyFirstStateMachine`

1. 对于权限，请接受默认的*创建新角色*。

1. 选择**创建**按钮以**实际**创建您的状态机。

 您应该会看到关于您的状态机和新 IAM 角色已创建的通知。

 系统将自动显示启动状态机的选项。您将在下一步中执行该操作！

![\[开始实验 Hello World 工作流的说明性图片\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/workflow-created.png)


**工作流创建完成！**  
Step Functions 创建了您的工作流和 IAM 角色。现在，您可以启动状态机了。

## 第 2 步 - 启动状态机
<a name="step-2-start-your-state-machine"></a>

 创建状态机后，您可以启动工作流运行。

 工作流可以接收**输入**，这些输入可以在当前状态中使用、发送给集成服务，以及传递给下一个状态。

**Hello World** 状态机是独立的，不需要输入。

![\[开始使用的说明性图片\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/start_283486381.jpg)


 **启动状态机**

1. 为执行的名称输入 `hello001`。

1. 将输入字段*留空*。

1. 选择**启动执行**按钮。

![\[启动工作流的说明性图片。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello001.png)


### 查看执行详细信息
<a name="review-the-execution-details"></a>

 启动后，您应该会立即看到前两个状态**已成功**。

 稍等片刻后，其余的状态转换将运行以完成工作流。

 您想知道 **Choice 状态**（*Is Hello World Example?*）如何决定分支到 **Wait for X Seconds** 状态吗？ 

1. 提示：状态机中的第一步包含分支决策所需的数据 

1. 在**图表视图**中，您可以监控执行的进度并浏览每种状态的详细信息。

1. 选择第一个 **Pass 状态**（名为 *Set Variables and State Output*），然后查看**输入/输出**选项卡。

 您应该会看到**状态输入**为空，但**状态输出**包含将 `IsHelloWorldExample` 的值设置为 `true` 的 JSON。

![\[执行 001\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello001-graph-view.png)


 从**图表视图**切换到**表格视图**，按名称、类型和状态查看状态列表。

![\[执行 001 表格视图\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello001-table.png)


**提示**  
请注意上一个屏幕截图中的**持续时间**和**时间线**字段。一眼就能看出哪些状态比其他状态花费了更多时间。

 在这个执行详细信息页面上还提供了另外两个视图：**事件视图**和**状态视图**。

 **事件视图**是流从一个状态切换到另一个状态的详细粒度视图。

 展开 “**PassStateExited**事件视图” 表中的第一个**PassStateEntered**和事件，以**查看**该状态如何不接受任何输入，分配一个名`CheckpointCount`为零值的变量，并生成您之前看到的输出。

![\[执行 001 事件视图\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello001-event-view.png)


 最后，**状态视图**类似于**表格视图**。在**状态视图**表中，您可以有选择地展开**状态**，以便仅查看每个状态的输入和输出：

![\[执行 001 状态视图\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello001-state-view.png)


**恭喜您！您已经运行了第一个 Step Functions 状态机！**  
 使用 Pass 状态将**静态数据**添加到工作流是一种常见的模式，尤其是在进行故障排除时。  
 在下一步中，您将更新工作流，以便*动态地*设置状态机输入。

## 第 3 步 - 处理外部输入
<a name="step-3-process-external-input"></a>

 在工作流中将 `IsHelloWorldExample` 的值设置为常量值是不现实的。您应该预期您的状态机会接收到各种不同的输入数据，并能正确响应。

 在此步骤中，我们将向您介绍如何使用外部 JSON 数据作为工作流的输入：

![\[处理外部输入\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/process-external-input.png)


### 移除硬编码的输入
<a name="remove-the-hardcoded-input"></a>

 首先，替换第一个 Pass 状态的**输出**中的硬编码值。

1. 选择页面右上角的**编辑状态机**按钮，编辑您的 Hello World 状态机。

1. 选择**启动**后的第一个 **Pass 状态**（名为 *Set Variables and State Output*），然后选择**输出**选项卡。

1. 将**输出**替换为以下 JSON：

   ```
   {
     "IsHelloWorldExample": "{% $states.input.hello_world %}",
     "ExecutionWaitTimeInSeconds":  "{% $states.input.wait %}"
   }
   ```

1. 保存状态机。

 更新后的状态输出将使用 JSONata 表达式从保留的 **[\$1](transforming-data.md#transforming-reserved-variable-states)** states 变量中提取输入数据。这些值将作为输出传递到下一个状态，成为下一个状态的输入。

### 使用输入数据运行更新的工作流
<a name="run-the-updated-workflow-with-input-data"></a>

 接下来，运行工作流并以 JSON 格式提供外部输入数据。

1. 选择**执行**按钮以运行工作流。

1. 对于**名称**，请使用随机生成的 ID。

1. 为输入字段使用以下 JSON：

   ```
   {
       "wait" : 20,
       "hello_world": true
   }
   ```

1. 选择**启动执行**按钮。

 您的状态机执行应该等待更长的时间（20 秒），但使用您提供的输入，执行最终应该会成功。

 在图表视图中，检查第一个 Pass 状态的**输入/输出**。请注意您提供的输入如何转换为输出。另外，请查看执行详细信息页面顶部的**执行输入和输出**。两个位置都显示您用于启动执行的输入。

**提示**  
如果您在 *hello\$1world* 设置为 **false** 的情况下运行新的执行，您预期会发生什么？ 试试看！

### 查看工作流执行情况
<a name="review-workflow-executions"></a>

 现在，您已经运行了几次工作流，请查看执行详细信息，以便查看工作流的运行情况。

 **查看执行详细信息**

1. 从导航面包屑或左侧菜单中选择**状态机**。

1. 选择您的状态机。

 在**执行**选项卡中，您应该看到一个执行列表，类似于以下屏幕截图：

![\[显示了 hello 工作流执行示例列表的说明性屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/hello-executions.png)


 最后提醒一点：工作流执行名称必须唯一，并且**不能**重复使用。尽管我们在本教程中建议使用短名称 (`hello001`)，但我们建议对生产工作负载采用一种能始终保证唯一性的命名约定。

**提示**  
 **恭喜您！**您已修改工作流以处理每次运行工作流时都可能不同的*外部输入*。

## 第 4 步 - 集成服务
<a name="step-4-integrate-a-service"></a>

 Step Functions 状态机可以使用 [AWSSDK 集成](https://docs.aws.amazon.com/step-functions/latest/dg/supported-services-awssdk.html)调用 220 多种AWS服务。 AWS服务为您的状态机提供超过 10,000 个潜在的 API 操作。

 在此步骤中，您将集成**用于情绪分析**的 Amazon Comprehend 任务，以处理您的状态机输入。

 服务集成使用三种*服务集成模式*之一：

1. **请求响应**（默认）- 等待 HTTP 响应，然后*立即*进入下一个状态。

1. **运行作业**（*.sync*）- 等待作业完成后再进入下一步。

1. **等待回电** (*. waitForTaskToken*)-暂停工作流程，直到外部进程返回任务令牌。

![\[描绘服务集成的说明性屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/AdobeStock_513621530_integration_1000.jpg)


 对于首次集成，您将使用**请求响应**（默认）集成模式。

### 集成如何工作？
<a name="how-do-integrations-work"></a>

 一个 *Task 状态*代表状态机执行的一个工作单元。您状态机中的所有工作由任务完成。

 任务通常通过将输入传递给其他服务的 API 操作来执行工作，然后这些服务执行自己的工作。您可以使用多个字段来指定任务的执行方式，这些字段包括：`Credentials`、`Retry`、`Catch`、`TimeoutSeconds` 等。您可以在 [Task 工作流程状态](state-task.md) 中了解有关任务的更多信息。

 要使用 AWS SDK 集成，您需要指定要调用的**服务名称**和 **API**。有些集成还需要参数。

 您可以使用 Amazon States 语言在任务状态的 “**资源**” 字段中指定 AWS API 操作。您可以选择在服务名称中添加服务集成类型。

 要指定 API 操作，可使用以下资源名称模板：

```
arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]
```

**参数名称大小写**  
请注意，API 操作将是*驼峰*大小写（小写首字母），但*ParameterNames*将是 Pascal 大小写（大写首字母）。

 **资源名称的示例**
+ `arn:aws:states:::aws-sdk:ec2:describeInstances`将返回调用 Amazon Desc EC2 ribeInstances API 的结果。
+ `arn:aws:states:::aws-sdk:s3:listBuckets` 将返回调用 Amazon S3 listBuckets API 的结果。
+ `arn:aws:states:::aws-sdk:sfn:startExecution` 将启动嵌套 Step Functions 状态机执行并返回该工作流的结果。

 当 Step Functions 使用 `Task` 状态调用另一个服务时，默认模式为[请求响应](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-default)。使用**请求响应**集成模式时，Step Functions 会调用服务，接收响应，然后***立即***进入下一个状态。

![\[情绪检测集成\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/integrate_sentiment_592194331.png)


### 第 4.1 步 - 添加情绪分析状态
<a name="step-1-add-sentiment-analysis-state"></a>

1. **编辑**您的**MyFirstStateMachine**状态机。

1. 在**状态浏览器**的**操作**面板中搜索 `DetectSentiment`。

1. **将 **Comp DetectSentiment rehend** 拖放到 “选择” 状态的 **“默认” 分支**上。**

1. 选择并删除 **Fail** 状态。

1. 从 “状态” **浏览器****的 “流程” 选项卡**中，将 “**成功**” 状态拖到后面**DetectSentiment**。

### 第 4.2 步 - 配置情绪分析状态
<a name="step-2-configure-the-sentiment-analysis-state"></a>

1. 选择 **Comprehend** 步骤以在检查器面板中对其进行配置。

1. 选择**参数和输出**选项卡，然后将**参数**替换为以下 JSON：

   ```
   {
      "LanguageCode": "en",
      "Text": "{% %}"
   }
   ```

1. 将光标置于百分号 `{% %}` **之间**，然后键入：`$`

1. 在编辑器中使用**自动完成**功能来选择 `states`，

    然后键入 `.` 并选择 `context`，

    然后键入 `.` 并选择 `Execution`，

    然后键入 `.` 并选择 `Input`，

    最后，键入 `.feedback_comment` 以从**上下文对象**中检索初始输入。

 选择这些自动完成选项后，您的状态 **Arguments** 应该具有以下 JSON：

```
{
    "LanguageCode": "en",
    "Text": "{% $states.context.Execution.Input.feedback_comment %}"
}
```

**使用编辑器自动完成**  
使用编辑器自动完成功能，您可以探索自己的选项。  
自动完成将列出您的变量、包含上下文对象的保留 **[\$1states](transforming-data.md#transforming-reserved-variable-states)** 变量以及可用函数及其定义！

### 第 4.3 步 - 配置身份策略
<a name="step-3-configure-an-identity-policy"></a>

 在可以运行工作流之前，您需要创建**角色**和**策略**以允许状态机对外部服务执行 API 调用。

 **为 Step Functions 创建 IAM 角色** 

1. 在新选项卡中转到 IAM 控制台，然后选择**角色**。

1. 选择**创建新角色**。

1. 对于**可信实体类型**，请选择*AWSService*。

1. 对于**用例，**请选择*Step Functions*。

1. 在**添加权限**中，选择**下一步**以接受默认策略。创建角色后，您将为 Comprehend 添加策略。

1. 对于**名称**，请输入 *HelloWorldWorkflowRole*。

1. 选择**创建角色**。

 **向亚马逊添加政策 Comp **HelloWorldWorkflowRole**rehend** 

1. 选择并编辑**HelloWorldWorkflowRole**角色。

1. 选择**添加权限**，然后选择**创建内联策略**。

1. 为服务选择 **Comprehend**。

1. 在 “**阅读**” 中 **DetectSentiment**，选择 “**下一步**”

1. 在**策略名称**中输入*DetectSentimentPolicy*，然后输入**创建策略**。

如果查看该政策，您会发现该策略允许所有资源执行**操作** `"comprehend:DetectSentiment"`。

 **将 IAM 角色附加到 Step Functions 状态机** 

1. 返回编辑状态机并选择**配置**选项卡。

1. 从 “**执行角色**” 下拉列表中选择*HelloWorldWorkflowRole*。

1. 保存您的状态机。

### 第 4.4 步 - 运行您的状态机
<a name="step-4-run-your-state-machine"></a>

 使用以下 JSON 作为输入开始执行您的状态机：

```
{
    "hello_world": false,
    "wait": 42,
    "feedback_comment" : "This getting started with Step Functions workshop is a challenge!"
}
```

#### 对权限错误进行故障排除...
<a name="policy-section"></a>

 如果没有正确的策略，您会看到类似于以下内容的**权限错误**：

```
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**步骤。查看各种视图 input/output 中的以查看情绪检测的结果。
+ 在表格视图中查找 DetectSentiment 状态的**持续时间**。
+ 更改 **JSON 输入**中的注释，然后重新运行您的状态机。

要了解有关情绪分析结果的更多信息，请参阅 [Amazon Comprehend - Sentiment](https://docs.aws.amazon.com/comprehend/latest/dg/how-sentiment.html)。

 考虑请求响应集成的一种方法是，响应通常仅表示请求的*确认*。但在某些集成中（例如情感分析），确认实际上表示任务的*完成*。

 关键要点是，在请求响应集成中，`Task` 状态**不会等待**底层任务完成。要等待响应，您需要探索*运行作业（.sync）*服务集成模式。

**恭喜您！**  
 您创建了第一个状态机并使用**请求响应**模式集成了情绪分析任务。

**我们非常重视您的反馈！**  
如果您觉得本入门教程很有帮助，或者您有改进教程的建议，请使用此页面上的反馈选项告诉我们。

## 清理 资源
<a name="clean-up-resources"></a>

 执行以下步骤来清理您创建的资源：

1. 导航到AWS控制台中的 [Step F](https://console.aws.amazon.com/states/home) unctions 页面。

1. 从左侧导航窗格中选择**状态机**。

1. 选择 **MyFirstStateMachine** 

1. 删除 IAM 角色

   1 - 单击 **IAM 角色**的链接以在新选项卡中转到 IAM 角色页面。删除自定义相关角色。

   2-在 IAM 角色中，搜索包含*MyFirstStateMachine*以下内容的自动生成的角色。删除自动生成的角色。

1. 返回 Step Functions 控制台选项卡，选择**操作**下拉列表，然后选择**删除**以删除状态机。

现在，您的状态机和相关角色应该已成功删除。