CloudFormationのテンプレートを書こう



### 初めに・・・
CloudFormationテンプレート作成に困ったので、以下にサンプルと各項目の説明を記載しました

## CloudFormationテンプレートの構成解説

### トップレベル構成
#### AWSTemplateFormatVersion:

CloudFormationテンプレートのバージョンを指定します。
"2010-09-09" は現行バージョンで、テンプレートの構文をAWSが認識します。
```
AWSTemplateFormatVersion: "2010-09-09"
```
#### Description:

テンプレートの目的を説明する任意の文字列です。
ここでは、「template state machine」と簡潔に説明されています。
```
Description: Sample template for an AWS Step Functions State Machine.
```
#### Metadata:

CloudFormationスタックのUIでの表示設定をカスタマイズします。
AWS::CloudFormation::Interface を使用し、入力パラメータをグループ化・ラベル付けして見やすくしています。
 - ParameterGroups:
   parameterをグループ化して、コンソール上で見やすく整理できる

 - ParameterLabels:
各パラメータの表示名を決定する


```
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: "Step Functions Configuration"
          Parameters:
            - StateMachineName
            - ExecRoleArn
      - Label:
          default: "Definition Configuration"
          Parameters:
            - ClusterArn
            - TaskDefinitionArn
    ParameterLabels:
      StateMachineName:
        default: State Machine Name
      ExecRoleArn:
        default: StateMachine Execution Role ARN
      ClusterArn:
        default: ECS Cluster ARN
      TaskDefinitionArn:
        default: ECS Task Definition ARN
```
### Parameterセクション
ステートマシンの動作に必要な値を外部から設定する

parameterlabelsで定義したパラメータ名を元に解説
  - StateMachineName:
  　　⇒ステートマシンの名前を指定
  - ExecRoleArn:
  　　⇒リソースにアクセスするためのIAMロールのARN
  - ClusterArn:
  　　⇒クラスターのARN
  - TaskDefinitionArn:
　　　⇒タスク定義のARN

```
Parameters:
  StateMachineName:
    Type: String
    Default: SampleStateMachine
    Description: The name of the Step Functions state machine.
  ExecRoleArn:
    Type: String
    Default: arn:aws:iam::123456789012:role/sample-role-step-functions
    Description: The ARN of the IAM role for Step Functions execution.
  ClusterArn:
    Type: String
    Default: arn:aws:ecs:region:123456789012:cluster/sample-ecs-cluster
    Description: The ARN of the ECS cluster.
  TaskDefinitionArn:
    Type: String
    Default: arn:aws:ecs:region:123456789012:task-definition/sample-task:latest
    Description: The ARN of the ECS task definition.
```

### Resourcesセクション

Resourcesセクションでは実際にIaC化したいすべてのリソース定義を記載する必要があります。

以下はステートマシン（Stepfunction）を例にとっています。
- StateMachineName:

ステートマシンの名前を指定（例: パラメータから参照）。

- DefinitionString:

ステートマシンのワークフロー定義（JSON形式）。


サンプルテンプレートファイル
-
以上の解説を踏まえたサンプルテンプレートファイルが以下になります
```
AWSTemplateFormatVersion: "2010-09-09"
Description: Sample template for an AWS Step Functions State Machine.
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: "Step Functions Configuration"
          Parameters:
            - StateMachineName
            - ExecRoleArn
      - Label:
          default: "Definition Configuration"
          Parameters:
            - ClusterArn
            - TaskDefinitionArn
    ParameterLabels:
      StateMachineName:
        default: State Machine Name
      ExecRoleArn:
        default: StateMachine Execution Role ARN
      ClusterArn:
        default: ECS Cluster ARN
      TaskDefinitionArn:
        default: ECS Task Definition ARN
Parameters:
  StateMachineName:
    Type: String
    Default: SampleStateMachine
    Description: The name of the Step Functions state machine.
  ExecRoleArn:
    Type: String
    Default: arn:aws:iam::123456789012:role/sample-role-step-functions
    Description: The ARN of the IAM role for Step Functions execution.
  ClusterArn:
    Type: String
    Default: arn:aws:ecs:region:123456789012:cluster/sample-ecs-cluster
    Description: The ARN of the ECS cluster.
  TaskDefinitionArn:
    Type: String
    Default: arn:aws:ecs:region:123456789012:task-definition/sample-task:latest
    Description: The ARN of the ECS task definition.
Resources:
  SampleStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      StateMachineName: !Ref StateMachineName
      DefinitionString:
        !Sub |
          {
            "Comment": "Sample Step Functions State Machine",
            "StartAt": "RunEcsTask",
            "States": {
              "RunEcsTask": {
                "Type": "Task",
                "Resource": "arn:aws:states:::ecs:runTask.sync",
                "Parameters": {
                  "LaunchType": "FARGATE",
                  "Cluster": "${ClusterArn}",
                  "TaskDefinition": "${TaskDefinitionArn}",
                  "NetworkConfiguration": {
                    "AwsvpcConfiguration": {
                      "AssignPublicIp": "DISABLED",
                      "SecurityGroups": [
                        "sg-0123456789abcdef0"
                      ],
                      "Subnets": [
                        "subnet-0123456789abcdef0"
                      ]
                    }
                  }
                },
                "Catch": [
                  {
                    "ErrorEquals": [
                      "States.ALL"
                    ],
                    "Next": "HandleTaskFailure"
                  }
                ],
                "Next": "TaskSuccess"
              },
              "HandleTaskFailure": {
                "Type": "Task",
                "Resource": "arn:aws:lambda:region:123456789012:function:sample-failure-handler",
                "Retry": [
                  {
                    "ErrorEquals": [
                      "States.TaskFailed"
                    ],
                    "IntervalSeconds": 2,
                    "MaxAttempts": 1,
                    "BackoffRate": 2
                  }
                ],
                "Next": "FailState"
              },
              "TaskSuccess": {
                "Type": "Succeed"
              },
              "FailState": {
                "Type": "Fail",
                "Error": "TaskFailed",
                "Cause": "ECS task execution failed."
              }
            }
          }
      RoleArn: !Ref ExecRoleArn


```