

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

# 使用 Terraform 在 Step Functions 中部署状态机
使用 Terraform 部署工作流程

[Terraform](https://www.terraform.io/intro/) by HashiCorp 是一个使用基础设施即代码 (IaC) 构建应用程序的框架。借助 Terraform，您可以创建状态机并使用特征，例如预览基础架构部署和创建可重复使用的模板。Terraform 模板通过将代码分解为多个较小的块来帮助您维护和重用代码。

如果您熟悉 Terraform，则可以按照本主题中描述的开发生命周期作为在 Terraform 中创建和部署状态机的模型。如果您不熟悉 Terraform，我们建议您先完成 [Amazon上的 Terraform 入门](https://catalog.workshops.aws/terraform101/en-US)讲习会，以熟悉 Terraform。

**提示**  
*要部署使用 Terraform 构建的状态机的示例，请参阅工作室中的 “使用 T [erraform 部署](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-terraform)”。 Amazon Step Functions *

**Topics**
+ [

## 先决条件
](#terraform-sfn-prerequisites)
+ [使用 Terraform 的开发生命周期](#terraform-sfn-dev-lifecycle)
+ [

## 状态机的 IAM 角色和策略
](#terraform-sfn-iam-policy)

## 先决条件


在开始之前，您必须满足以下先决条件：
+ 在您的系统上安装 Terraform。有关安装 Terraform 的信息，请参阅[安装 Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)。
+ 在系统上安装 Step Functions Local。我们建议您安装 Step Functions Local Docker 映像，用于使用 Step Functions Local。有关更多信息，请参阅 [使用 Step Functions Local 测试状态机（不支持）](sfn-local.md)。
+ 安装 Amazon SAM CLI。有关安装信息，请参阅[《*Amazon Serverless Application Model 开发人员指南》*中的 “安装 Amazon SAM CLI](https://docs.amazonaws.cn/serverless-application-model/latest/developerguide/install-sam-cli.html)”。
+ 安装 Amazon Toolkit for Visual Studio Code 以查看状态机的工作流程图。有关安装信息，请参阅《Amazon Toolkit for Visual Studio Code 用户指南》中的[安装 Amazon Toolkit for Visual Studio Code](https://docs.amazonaws.cn/toolkit-for-vscode/latest/userguide/setup-toolkit.html)。**

## 使用 Terraform 的状态机开发生命周期
使用 Terraform 的开发生命周期

以下过程说明了如何使用在 Step Functions 控制台中使用 [Workflow Studio](workflow-studio.md) 构建的状态机原型作为使用 Terraform 和 [Amazon Toolkit for Visual Studio Code](https://docs.amazonaws.cn/toolkit-for-vscode/latest/userguide/welcome.html) 进行本地开发的起点。

要查看讨论使用 Terraform 开发状态机并详细介绍最佳实操的完整示例，请参阅[编写 Step Functions Terraform 项目的最佳实操](https://www.amazonaws.cn/blogs/devops/best-practices-for-writing-step-functions-terraform-projects/)。

**使用 Terraform 启动状态机的开发生命周期**

1. 使用以下命令可引导新的 Terraform 项目。

   ```
   terraform init
   ```

1. 打开 [Step Functions 控制台](https://console.amazonaws.cn/states/home?region=us-east-1#/)，为状态机创建原型。

1. 在 Works Studio 中，执行以下操作：

   1. 创建您的工作流原型。

   1. 导出工作流的 [Amazon States Language (ASL)](concepts-amazon-states-language.md) 定义。为此，请选择**导入/导出**下拉列表，然后选择**导出 JSON 定义**。

1. 将导出的 ASL 定义保存在项目目录中。

   您将导出的 ASL 定义作为输入参数传递给使用 [https://developer.hashicorp.com/terraform/language/functions/templatefile](https://developer.hashicorp.com/terraform/language/functions/templatefile) 函数的 [https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest](https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest) Terraform 资源。此函数在定义字段中使用，该字段传递导出的 ASL 定义和任何变量替换。
**提示**  
由于 ASL 定义文件可能包含较长的文本块，因此我们建议您避免使用内联 EOF 方法。这可让您更轻松地将参数替换到状态机定义中。

1. （可选）更新 IDE 中的 ASL 定义并使用 Amazon Toolkit for Visual Studio Code可视化您的更改。  
![\[Visual Studio Code 中工作流的 ASL 定义及其可视化表示的屏幕截图。\]](http://docs.amazonaws.cn/step-functions/latest/dg/images/visualize-sm-terraform-iac.png)

   为避免持续导出定义并将其重构到项目中，我们建议您在 IDE 中进行本地更新，并使用 [Git](https://git-scm.com/) 跟踪这些更新。

1. 使用 [Step Functions Local](sfn-local.md) 测试工作流。
**提示**  
您还可以在状态机中使用 [Amazon SAM C](sfn-local-lambda.md) LI Local 在本地测试与 Lambda 函数和 API APIs Gateway 的服务集成。

1. 在部署状态机之前，请预览状态机和其他 Amazon 资源。为此，请运行以下命令。

   ```
   terraform plan
   ```

1. 使用以下命令从本地环境或通过 [CI/CD 管道](https://www.amazonaws.cn/blogs/developer/build-infrastructure-ci-for-terraform-code-leveraging-aws-developer-tools-and-terratest/)部署状态机。

   ```
   terraform apply
   ```

1. （可选）使用以下命令清理资源并删除状态机。

   ```
   terraform destroy
   ```

## 状态机的 IAM 角色和策略


使用 [Terraform 服务集成策略](https://registry.terraform.io/modules/terraform-aws-modules/step-functions/aws/latest#service-integration-policies)为您的状态机添加必要的 IAM 权限，例如调用 Lambda 函数的权限。您还可以定义明确的角色和策略，并将它们与状态机相关联。

以下 IAM 策略示例授予您的状态机调用名为 `myFunction` 的 Lambda 函数的权限。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction"
      ],
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:myFunction"
    }
  ]
}
```

我们还建议在 Terraform 中为状态机定义 IAM 策略时使用 [https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) 数据来源。这可以帮助您检查策略是否格式有误，并用变量替换任何资源。

以下 IAM 策略示例使用 `aws_iam_policy_document` 数据来源，并授予您的状态机调用名为 `myFunction` 的 Lambda 函数的访问权限。

```
data "aws_iam_policy_document" "state_machine_role_policy" {
  
  statement {
    effect = "Allow"

    actions = [
      "lambda:InvokeFunction"
    ]

    resources = ["${aws_lambda_function.function-1.arn}:*"]
  }
  
}
```

**提示**  
要查看使用 Terraform 部署的更高级的 Amazon 架构模式，请参阅 Serverless Land Workflows 集合[中的 Terraform 示例](https://serverlessland.com/workflows?framework=Terraform)。