

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

# 教程：使用 Step Functions 和 AWS SAM CLI Local 测试工作流程
<a name="sfn-local-lambda"></a>

**不支持 Step Functions Local**  
Step Functions Local 功能**并不**完备且**不受支持**。  
出于测试目的，您可以考虑使用能够模拟 Step Functions 的第三方解决方案。  
作为 Step Functions Local 的替代方案，您可以在部署到您的 AWS 账户之前使用 TestState API 对状态机逻辑进行单元测试。有关更多信息，请参阅[使用 TestState API 测试状态机](https://docs.aws.amazon.com/step-functions/latest/dg/test-state-isolation.html)。

两者 AWS Step Functions 兼而有之，在本地计算机上 AWS Lambda 运行，您无需将代码部署到即可测试状态机和 Lambda 函数。 AWS

有关更多信息，请参阅以下主题：
+ [使用 Step Functions Local 测试状态机（不支持）](sfn-local.md)
+ [设置 AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html)

## 第 1 步：设置 AWS SAM
<a name="install-sam"></a>

AWS Serverless Application Model (AWS SAM) CLI Local 需要安装 AWS Command Line Interface AWS SAM、和 Docker。

1. [安装 C AWS SAM LI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)。
**注意**  
在安装 AWS SAM CLI 之前，你需要安装 AWS CLI 和 Docker。参见安装 AWS SAM CLI 的[先决条件](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)。

1. 通读 [AWS SAM 快速入门](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html)文档。请务必按照以下步骤执行以下操作：

   1. [初始化应用程序](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html#gs-ex1-setup-local-app)

   1.  [在本地测试应用程序](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html#gs-ex1-test-locally) 

   

   这将创建 `sam-app` 目录，并将生成环境，其中包括基于 Python 语言的 Hello World Lambda 函数。

   

## 步骤 2：在本地测试 AWS SAM CLI
<a name="test-local-lambda"></a>

现在，您已经安装 AWS SAM 并创建了 Hello World Lambda 函数，可以测试该函数了。在 `sam-app` 目录中，输入下面的命令：

```
sam local start-api
```

这将启动 Lambda 函数的本地实例。您应该可以看到类似于如下所示的输出内容：

```
2019-01-31 16:40:27 Found credentials in shared credentials file: ~/.aws/credentials
2019-01-31 16:40:27 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
2019-01-31 16:40:27 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2019-01-31 16:40:27  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
```

打开浏览器并输入以下内容：

```
http://127.0.0.1:3000/hello
```

这将输出类似于以下内容的响应：

```
{"message": "hello world", "location": "72.21.198.66"}
```

按 **CTRL\$1C** 以终止 Lambda API。

## 步骤 3：启动本地 AWS SAM CLI
<a name="start-local-lambda"></a>

现在您已经测试了该功能是否有效，请启动 AWS SAM CLI Local。在 `sam-app` 目录中，输入下面的命令：

```
sam local start-lambda
```

这将启动 AWS SAM CLI Local 并提供要使用的端点，类似于以下输出：

```
2019-01-29 15:33:32 Found credentials in shared credentials file: ~/.aws/credentials
2019-01-29 15:33:32 Starting the Local Lambda Service. You can now invoke your Lambda Functions defined in your template through the endpoint.
2019-01-29 15:33:32  * Running on http://127.0.0.1:3001/ (Press CTRL+C to quit)
```

## 第 4 步：启动 Step Functions Local
<a name="start-stepfunctions-local"></a>

### JAR 文件
<a name="start-local-jar"></a>

如果使用 `.jar` 文件版本的 Step Functions Local，请启动 Step Functions 并指定 Lambda 端点。在提取 `.jar` 文件的目录中，输入以下命令：

```
java -jar StepFunctionsLocal.jar --lambda-endpoint http://localhost:3001
```

当 Step Functions Local 启动时，它将检查环境，然后检查 `~/.aws/credentials` 文件中配置的凭证。默认情况下，它开始使用虚假用户 ID，并列出为 `region us-east-1`。

```
2019-01-29 15:38:06.324: Failed to load credentials from environment because Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY))
2019-01-29 15:38:06.326: Loaded credentials from profile: default
2019-01-29 15:38:06.326: Starting server on port 8083 with account account-id, region us-east-1
```

### Docker
<a name="start-local-docker"></a>

如果您使用 Docker 版本的 Step Functions Local，请使用以下命令启动 Step Functions：

```
docker run -p 8083:8083 amazon/aws-stepfunctions-local
```

有关安装 Docker 版本的 Step Functions 的信息，请参阅[在 Docker 中设置 Step Functions Local（可下载版本）](sfn-local.md#sfn-local-docker)。

**注意**  
您可以通过命令行指定端点；如果您从 `.jar` 文件启动 Step Functions，则可以通过设置环境变量来指定。对于 Docker 版本，您必须在文本文件中指定端点和凭证。请参阅[为 Step Functions Local 设置配置选项](sfn-local.md#sfn-local-config-options)。

## 步骤 5：创建引用 AWS SAM CLI 本地函数的状态机
<a name="create-local-statemachine"></a>

在 Step Functions Local 运行后，创建一个状态机，该状态机引用您在[第 1 步：设置 AWS SAM](#install-sam) 中初始化的 `HelloWorldFunction`。

```
aws stepfunctions --endpoint http://localhost:8083 create-state-machine --definition "{\
  \"Comment\": \"A Hello World example of the Amazon States Language using an AWS Lambda Local function\",\
  \"StartAt\": \"HelloWorld\",\
  \"States\": {\
    \"HelloWorld\": {\
      \"Type\": \"Task\",\
      \"Resource\": \"arn:aws:lambda:region:account-id:function:HelloWorldFunction\",\
      \"End\": true\
    }\
  }\
}\" --name "HelloWorld" --role-arn "arn:aws:iam::012345678901:role/DummyRole"
```

这将创建一个状态机，并提供一个您可以用来启动执行的 Amazon 资源名称 (ARN)。

```
{
    "creationDate": 1548805711.403, 
    "stateMachineArn": "arn:aws:states:region:account-id:stateMachine:HelloWorld"
}
```

## 第 6 步：启动本地状态机执行
<a name="run-local-statemachine"></a>

创建状态机后，启动执行。使用以下 **aws stepfunctions** 命令时，您需要引用端点和状态机 ARN：

```
aws stepfunctions --endpoint http://localhost:8083 start-execution --state-machine arn:aws:states:region:account-id:stateMachine:HelloWorld --name test
```

这将启动 `HelloWorld` 状态机的名为 `test` 的执行。

```
{
    "startDate": 1548810641.52, 
    "executionArn": "arn:aws:states:region:account-id:execution:HelloWorld:test"
}
```

现在 Step Functions 已在本地运行，你可以使用与之交互 AWS CLI。例如，要获取有关此执行的信息，请使用以下命令：

```
aws stepfunctions --endpoint http://localhost:8083 describe-execution --execution-arn arn:aws:states:region:account-id:execution:HelloWorld:test
```

请为执行调用 `describe-execution`，这可以提供更完整的详细信息，内容与下面的输出类似：

```
{
    "status": "SUCCEEDED", 
    "startDate": 1549056334.073, 
    "name": "test", 
    "executionArn": "arn:aws:states:region:account-id:execution:HelloWorld:test", 
    "stateMachineArn": "arn:aws:states:region:account-id:stateMachine:HelloWorld", 
    "stopDate": 1549056351.276, 
    "output": "{\"statusCode\": 200, \"body\": \"{\\\"message\\\": \\\"hello world\\\", \\\"location\\\": \\\"72.21.198.64\\\"}\"}", 
    "input": "{}"
}
```