クリスマステートマシンツリー、実装してみた

# 今週末はクリスマスですね

クリスマスといえば、クリスマスツリーですね。
外は寒いですが、イルミネーションに囲まれたクリスマスツリーを見に行くの楽しいですよね。
東京ミッドタウンのクリスマスツリーとか大きくてとても綺麗ですよね。

https://www.tokyo-midtown.com/jp/event/xmas/illuminations.html#navi2

家でもクリスマスツリーを立てたりしますよね。
一人暮らしだと、わざわざツリー立てるのも片付けるのも面倒だと思ってしまいます。
でもお家でもクリスマスツリー楽しみたいなー...

そんなあなたに。
とっておきの方法があります。

そう、AWSアカウントさえあれば。
しかも無料で。

# Step Functionsでクリスマスツリーを立てよう

Step FunctionsはAWSが提供するサーバーレスのワークフローサービスです。
AWSサービスを組み合わせて、ユーザーが定義した「ステートマシン」を使って複雑なワークフローを構築できます。
ETL（データの抽出、変換、ロード）処理の自動化や、機械学習用データを準備するパイプライン、マイクロサービスのオーケストレーションなどに活用できます。

https://aws.amazon.com/jp/step-functions/

今回はこのサービスを使ってクリスマスツリー、もとい、「クリスマステートマシンツリー」を立てちゃいました。

ピンとこないですか？

百聞は一見にしかずと言いますし、早速お披露目いたします！

# クリスマステートマシンツリー🎄

![stepfunctions_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/2e1aca75-8f49-a716-eb00-40db9dc1d6de.png)

どうでしょう。
意外とツリーしてませんか？

# 飾り方

1. AWSアカウントのマネジメントコンソールからStep Functionsをページを開く or AWSアカウントにログインした状態で下のリンクにアクセス
https://ap-northeast-1.console.aws.amazon.com/states/home
2. ページ上部の「ステートマシンの作成」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/8ae2d8f8-6290-fa30-035f-2ef1e7f288d0.png)
3. 作成ページに移動したら、「コードでワークフローを記述」を選択。「タイプ」は標準のままでok。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/4329782f-4916-5352-195e-1c173f93f76c.png)
4. 「定義」のコードを以下に置き換える（コピペして使ってください）
```json:クリスマステートマシンツリー定義
{
  "Comment": "A description of my state machine",
  "StartAt": "🌟",
  "States": {
    "🌟": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "🦌",
          "States": {
            "🦌": {
              "Type": "Pass",
              "Next": "🎅🏻"
            },
            "🎅🏻": {
              "Type": "Parallel",
              "End": true,
              "Branches": [
                {
                  "StartAt": "🕯",
                  "States": {
                    "🕯": {
                      "Type": "Pass",
                      "Next": "🤶🏻"
                    },
                    "🤶🏻": {
                      "Type": "Parallel",
                      "End": true,
                      "Branches": [
                        {
                          "StartAt": "🎅🏽",
                          "States": {
                            "🎅🏽": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        },
                        {
                          "StartAt": "🧑🏽‍🎄",
                          "States": {
                            "🧑🏽‍🎄": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        }
                      ]
                    }
                  }
                },
                {
                  "StartAt": "🧦",
                  "States": {
                    "🧦": {
                      "Type": "Pass",
                      "Next": "🎅🏼"
                    },
                    "🎅🏼": {
                      "Type": "Parallel",
                      "End": true,
                      "Branches": [
                        {
                          "StartAt": "🤶🏽",
                          "States": {
                            "🤶🏽": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        },
                        {
                          "StartAt": "🎅🏾",
                          "States": {
                            "🎅🏾": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        },
        {
          "StartAt": "🛷",
          "States": {
            "🛷": {
              "Type": "Pass",
              "Next": "🧑🏻‍🎄"
            },
            "🧑🏻‍🎄": {
              "Type": "Parallel",
              "End": true,
              "Branches": [
                {
                  "StartAt": "⛄",
                  "States": {
                    "⛄": {
                      "Type": "Pass",
                      "Next": "🧑🏼‍🎄"
                    },
                    "🧑🏼‍🎄": {
                      "Type": "Parallel",
                      "End": true,
                      "Branches": [
                        {
                          "StartAt": "🧑🏾‍🎄",
                          "States": {
                            "🧑🏾‍🎄": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        },
                        {
                          "StartAt": "🤶🏾",
                          "States": {
                            "🤶🏾": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        }
                      ]
                    }
                  }
                },
                {
                  "StartAt": "🔔",
                  "States": {
                    "🔔": {
                      "Type": "Pass",
                      "Next": "🤶🏼"
                    },
                    "🤶🏼": {
                      "Type": "Parallel",
                      "End": true,
                      "Branches": [
                        {
                          "StartAt": "🎁",
                          "States": {
                            "🎁": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        },
                        {
                          "StartAt": "🇨🇽",
                          "States": {
                            "🇨🇽": {
                              "Type": "Pass",
                              "End": true
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
```
5\. コードを編集し終えたら、ページ下部の「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/6be8cd10-2446-09e2-d01a-5cdb12f3db85.png)
6. 詳細を指定するページで名前をつけます。なんでもいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/9424bfac-d01e-23c5-7d95-4e8aeca0ddec.png)
7. 実行ロールは「新しいロールの作成」のままでいいです。他の設定は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/f5114d5f-571f-76c9-2dc9-f9f6f72f2a4e.png)
8. ページ下部の「ステートマシンの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/87256403-bfd5-ae25-7a67-faedb1d34825.png)
9. 作成されたクリスマステートマシンツリーのページが開かれます。
10. クリスマステートマシンツリーのページで「実行の開始」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/c9a9114e-3b92-4e43-32a0-16f07f1c4d25.png)
11. 「入力」に適当にJSONを入れてください。なんでもいいです。実行の「名前」もなんでもいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/9d048ac9-8a11-2d87-8578-baa9734202f0.png)
12. 「実行の開始」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/2c1a39c6-8ba6-9eca-0b84-dc287338d8fa.png)
13. 0.3秒程度でクリスマステートマシンツリーが完成します！（実行詳細画面のグラフ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708554/a7462eee-f549-fd9d-b2ad-78029852b592.png)

ステートマシンは処理が成功すると各ステート（状態）が緑色で示されるので、それをモミの木の色として利用しています。
また、各ステートの名前をemojiにすることで、ツリーのオーナメントを飾ることができました。
ステートのタイプとしてはParallelとPassの2種類を組み合わせていて、中身の処理としては何もせず、ただステートを上から順番に実行していくものになります。

オーナメントやツリーの構造はお好みでカスタマイズください。
Step Functionsの提供するワークフロースタジオを使えば、GUI操作でステートマシンを編集できます。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/workflow-studio-use.html#workflow-studio-components-create-edit

# Step Functions使ってますか？
ここ数年のアップデートが著しいStep Functions。
サーバーレスサービスの利用が進むにつれて、ますます存在感の高まるサービスになることは間違いないと思います。

弊社でもこの1, 2年で活用シーンが増えてきました。
いくつかStep Functions関連の記事も投稿しています。

https://qiita.com/fumiya0238/items/9c74dbbcaf6ed7086c6b

https://qiita.com/fumiya0238/items/93db7385c77d1c929f7d

https://qiita.com/yuji_saito/items/1026234dcf81b43645e4

私もStep Functionsでの開発を行なってきているので、来年はQiitaでStep Functionsの知見を発信できたら幸いです。