

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

# 使用创建 Step Functions 状态机 AWS SAM
<a name="tutorial-state-machine-using-sam"></a>

在本指南中，您将下载、构建和部署包含 AWS Step Functions 状态机的示例 AWS SAM 应用程序。此应用程序创建一个模拟股票交易工作流程，该工作流程按预定义的时间表运行（请注意，该时间表默认情况下处于禁用状态以免产生费用）。

下图显示此应用程序的组件：

![\[该图显示了本教程的工作流程。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/sam-starter-template-docs.png)


以下是为创建示例应用程序而运行的命令的预览。有关其中每个命令的更多详细信息，请参阅本页后面的各个部分

```
# Step 1 - Download a sample application. For this tutorial you
#   will follow the prompts to select an AWS Quick Start Template
#   called 'Multi-step workflow'
sam init

# Step 2 - Build your application
cd project-directory
sam build

# Step 3 - Deploy your application
sam deploy --guided
```

## 先决条件
<a name="tutorial-state-machine-using-sam-prerequisites"></a>

本指南假设您已完成为操作系统[安装 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) 中的步骤。它假定您已经完成了以下操作：

1. 已创建 AWS 账户。

1. 已配置 IAM 权限

1. 已安装 Homebrew。注意：Homebrew 只是 Linux 和 macOS 的先决条件。

1. 已安装 C AWS SAM LI。注意：请确保您具有版本 0.52.0 或更高版本。您可以通过执行命令 `sam --version` 来检查您具有的版本。

## 步骤 1：下载示例 AWS SAM 应用程序
<a name="tutorial-state-machine-using-sam-initialize"></a>

**要运行的命令：**

```
sam init
```

按照屏幕上的提示选择以下内容：

1. **模板：** AWS 快速入门模板

1. **语言：**Python、Ruby、NodeJS、Go、Java 或 .NET

1. **项目名称：**（您选择的名称 - 默认为 `sam-app`）

1. **快速入门应用程序：**多步骤工作流

** AWS SAM 正在做什么：**

此命令使用您为“项目名称”提示符提供的名称创建一个目录（默认为 `sam-app`）。目录的具体内容将取决于您选择的语言。

以下是选择其中一个 Python 运行时时的目录内容：

```
├── README.md
├── functions
│   ├── __init__.py
│   ├── stock_buyer
│   │   ├── __init__.py
│   │   ├── app.py
│   │   └── requirements.txt
│   ├── stock_checker
│   │   ├── __init__.py
│   │   ├── app.py
│   │   └── requirements.txt
│   └── stock_seller
│       ├── __init__.py
│       ├── app.py
│       └── requirements.txt
├── statemachine
│   └── stock_trader.asl.json
├── template.yaml
└── tests
    └── unit
        ├── __init__.py
        ├── test_buyer.py
        ├── test_checker.py
        └── test_seller.py
```

您可以看到两个特别有趣的文件，：
+ `template.yaml`：包含定义应用程序 AWS 资源的 AWS SAM 模板。
+ `statemachine/stockTrader.asl.json`：包含在[使用 Amazon States Language 定义 Step Functions 工作流程](concepts-amazon-states-language.md)中编写的应用程序的状态机定义。

您可以在 `template.yaml` 文件中看到以下条目，该条目指向状态机定义文件：



```
    Properties:
      DefinitionUri: statemachine/stock_trader.asl.json
```

将状态机定义保留为一个单独的文件而不是将其嵌入到 AWS SAM 模板中会很有帮助。例如，如果您不将状态机定义嵌入到模板中，跟踪状态机定义的更改会更容易。您可以使用 Workflow Studio 创建和维护状态机定义，并将定义直接从控制台导出到 Amazon States Language 规范文件中，无需将其合并到模板中。

有关示例应用程序的更多信息，请参阅项目目录中的 `README.md` 文件。

## 第 2 步：构建应用程序
<a name="tutorial-state-machine-using-sam-build"></a>

**要运行的命令：**

首先转到项目目录（也即，示例应用程序的 `template.yaml` 文件所在的目录；默认情况下是 `sam-app`），然后运行以下命令：

```
sam build
```

**输出示例：**

```
  
 Build Succeeded

 Built Artifacts  : .aws-sam/build
 Built Template   : .aws-sam/build/template.yaml

 Commands you can use next
 =========================
 [*] Invoke Function: sam local invoke
 [*] Deploy: sam deploy --guided
```

** AWS SAM 正在做什么：**

 AWS SAM CLI 附带了许多 Lambda 运行时的抽象来构建您的依赖项，并将所有构建工件复制到暂存文件夹中，以便随时可以打包和部署所有内容。`sam build` 命令将构建您的应用程序具有的任何依赖项，并将构建构件复制到 `.aws-sam/build` 下的文件夹中。

## 步骤 3：将您的应用程序部署到 AWS 云端
<a name="tutorial-state-machine-using-sam-deploy"></a>

**要运行的命令：**

```
sam deploy --guided
```

按照屏幕上的提示操作。您只需通过 `Enter` 进行响应，即可接受交互式体验中提供的默认选项。

** AWS SAM 正在做什么：**

此命令将您的应用程序部署到 AWS 云端。它使用您使用`sam build`命令构建的部署项目，将其打包并上传到由 AWS SAM CLI 创建的 Amazon S3 存储桶，然后使用部署应用程序。 CloudFormation在部署命令的输出中，您可以看到正在对 CloudFormation 堆栈进行的更改。

您可以通过以下步骤验证示例 Step Functions 状态机是否已成功部署：

1. 登录 AWS 管理控制台 并打开 Step Functions 控制台，网址为[https://console.aws.amazon.com/states/](https://console.aws.amazon.com/states/)。

1. 在左侧导航中，选择 **State machines (状态机)**。

1. 在列表中查找并选择您的新状态机。它将被命名为 StockTradingStateMachine-*<unique-hash>*。

1. 选择**定义**选项卡。

您现在应该看到状态机的可视化表示。您可以验证可视化表示是否与在项目目录的 `statemachine/stockTrader.asl.json` 文件中找到的状态机定义相匹配。

## 问题排查
<a name="tutorial-state-machine-using-sam-troubleshooting"></a>

### SAM CLI 错误：“没有此类选项：--guided”
<a name="tutorial-state-machine-using-sam-troubleshooting-guided"></a>

执行 `sam deploy` 时，您会看到以下错误：

```
 
Error: no such option: --guided
```

这意味着您使用的是不支持该`--guided`参数的旧版 AWS SAM CLI。要解决这个问题，你可以将你的 AWS SAM CLI 版本更新到 0.33.0 或更高版本，也可以省略命令中的`--guided`参数。`sam deploy`

### SAM CLI 错误：“无法创建托管资源：无法找到凭证”
<a name="tutorial-state-machine-using-sam-troubleshooting-credentials"></a>

执行 `sam deploy` 时，您会看到以下错误：

```
 
Error: Failed to create managed resources: Unable to locate credentials
```

这意味着您尚未设置 AWS 证书以允许 AWS SAM CLI 进行 AWS 服务调用。要解决此问题，您必须设置 AWS 凭据。有关更多信息，请参阅《*AWS Serverless Application Model 开发人员指南》*中的[设置 AWS 凭证](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started-set-up-credentials.html)。

## 清除
<a name="tutorial-state-machine-using-sam-cleanup"></a>

如果您不再需要通过运行本教程创建的 AWS 资源，则可以通过删除已部署的 CloudFormation 堆栈来移除这些资源。

要使用删除在本教程中创建的 CloudFormation 堆栈 AWS 管理控制台，请执行以下步骤：

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 在左侧导航窗格中，选择**堆栈**。

1. 在堆栈列表中，选择 **sam-app**（或您创建的堆栈的名称）。

1. 选择**删除**。

完成后，堆栈的状态将更改为 **DELETE\$1COMPLETE**。

或者，您可以通过执行以下 AWS CLI 命令来删除 CloudFormation 堆栈：

```
aws cloudformation delete-stack --stack-name sam-app --region region
```

### 验证已删除堆栈
<a name="tutorial-state-machine-using-sam-cleanup-verify"></a>

对于两种删除 CloudFormation 堆栈的方法，您都可以通过转到 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)，在左侧导航窗格中选择 **Stacks**，然后在搜索文本框右侧的下拉列表中选择 “**已删除**” 来验证堆栈已删除。您应该在已删除堆栈的列表中看到您的堆栈名称 **sam-app**（或您创建的堆栈的名称）。