

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Terraform を使用して Step Functions でステートマシンをデプロイする
<a name="terraform-sfn"></a>

[Terraform](https://www.terraform.io/intro/) by HashiCorp は、Infrastructure as Code (IaC) を使用してアプリケーションを構築するためのフレームワークです。Terraform では、ステートマシンを作成したり、インフラストラクチャデプロイのプレビューや再利用可能なテンプレートの作成などの機能を使用したりできます。Terraform テンプレートを使用すると、コードが小さなチャンクに分割されるため、コードを保守して再利用しやすくなります。

Terraform に精通していれば、Terraform でステートマシンを作成してデプロイするためのモデルとして、このトピックで説明する開発ライフサイクルをたどることができます。Terraform に慣れていない場合は、まず「[AWS Introduction to Terraform on ](https://catalog.workshops.aws/terraform101/en-US)」というワークショップを完了して Terraform をよく知っておくことをお勧めします。

**ヒント**  
Terraform を使用して構築されたステートマシンの例をデプロイするには、*「 AWS Step Functions ワークショップ*」の[「Terraform を使用してデプロイする](https://catalog.workshops.aws/stepfunctions/iac/deploy-with-terraform)」を参照してください。

**Topics**
+ [前提条件](#terraform-sfn-prerequisites)
+ [Terraform を使用した開発ライフサイクル](#terraform-sfn-dev-lifecycle)
+ [ステートマシンの IAM ロールとポリシー](#terraform-sfn-iam-policy)

## 前提条件
<a name="terraform-sfn-prerequisites"></a>

開始するには、以下の前提条件を満たしていることを確認する必要があります。
+ Terraform をマシンにインストールします。Terraform のインストールについて詳しくは、「[Terraform をインストールする](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)」を参照してください。
+ マシンに Step Functions Local をインストールします。Step Functions Local を使用するには、Step Functions Local の Docker イメージをインストールすることをお勧めします。詳細については、「[Step Functions Local を使用したステートマシンのテスト (非サポート)](sfn-local.md)」を参照してください。
+ CLI AWS SAM をインストールします。インストールの詳細については、「 *AWS Serverless Application Model デベロッパーガイド*[」の AWS SAM 「 CLI のインストール](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)」を参照してください。
+ をインストール AWS Toolkit for Visual Studio Code して、ステートマシンのワークフロー図を表示します。インストールの情報については、「*AWS Toolkit for Visual Studio Code ユーザーガイド*」の「[AWS Toolkit for Visual Studio Codeのインストール](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html)」を参照してください。

## Terraform を使用したステートマシンの開発ライフサイクル
<a name="terraform-sfn-dev-lifecycle"></a>

以下の手順では、Step Functions コンソールの [Workflow Studio](workflow-studio.md) を使用してビルドしたステートマシンプロトタイプを、Terraform と [AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html) によるローカル開発の開始点として使用する方法について説明します。

Terraform を使ったステートマシン開発について説明してベストプラクティスの詳細を示す完全な例を見るには、「[Best Practices for Writing Step Functions Terraform Projects](https://aws.amazon.com/blogs/devops/best-practices-for-writing-step-functions-terraform-projects/)」を参照してください。

**Terraform を使ってステートマシンの開発ライフサイクルを開始するには**

1. 次のコマンドを使用して、新しい Terraform プロジェクトをブートストラップします。

   ```
   terraform init
   ```

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home?region=us-east-1#/)を開き、ステートマシンのプロトタイプを作成します。

1. Workflow 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 定義を更新し、 AWS Toolkit for Visual Studio Codeを使用して変更内容を視覚化します。  
![\[Visual Studio Code のワークフローの ASL 定義とその視覚的表現のスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/visualize-sm-terraform-iac.png)

   定義を継続的にエクスポートしてプロジェクトにリファクタリングすることを避けるために、IDE でローカルに更新を行い、その更新を [Git ](https://git-scm.com/) で追跡することをお勧めします。

1. [Step Functions Local](sfn-local.md) を使用してワークフローをテストします。
**ヒント**  
[AWS SAM CLI Local を使用して](sfn-local-lambda.md)、ステートマシンで Lambda 関数および API Gateway API とのサービス統合をローカルでテストすることもできます。

1. ステートマシンをデプロイする前に、ステートマシンやその他の AWS リソースをプレビューします。これを行うには、以下のコマンドを実行します。

   ```
   terraform plan
   ```

1. 以下のコマンドを使用して、ローカル環境または [CI/CD パイプライン](https://aws.amazon.com/blogs/developer/build-infrastructure-ci-for-terraform-code-leveraging-aws-developer-tools-and-terratest/)からステートマシンをデプロイします。

   ```
   terraform apply
   ```

1. (オプション) 以下のコマンドを使用して、リソースをクリーンアップし、ステートマシンを削除します。

   ```
   terraform destroy
   ```

## ステートマシンの IAM ロールとポリシー
<a name="terraform-sfn-iam-policy"></a>

[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 でデプロイされたより高度な AWS アーキテクチャパターンを確認するには、[「Serverless Land Workflows Collection」の「Terraform examples](https://serverlessland.com/workflows?framework=Terraform)」を参照してください。