AWS Step Functionsでランダムアルファベットに基づくLambda関数の実行

AWS Step Functionsは、分散システムの調整や状態管理を簡単にするための強力なツールです。今回は、Step Functionsを使って、ランダムなアルファベットを生成し、その結果に基づいて異なるLambda関数を実行する方法をご紹介します。このプロセスを通じて、StepFunction の基礎の基礎を学びます。

具体的には、まずランダムなアルファベット「A」、「B」、「C」を生成するLambda関数を呼び出し、その結果に基づいて「A_Process」、「B_Process」、「C_Process」のいずれかのプロセスを実行します。それぞれのプロセスは別々のLambda関数で処理され、最終的に結果を出力するLambda関数が呼び出されます。この一連の流れをStep Functionsでどのように実装するかを詳しく解説します。

### Step Function の構成
完成時の Step Function の構成は以下の通りです。
![stepfunctions_graph (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/f2421436-4313-e4a0-9742-b271ddc4590d.png)


Generate Random Alphabet で「A」、「B」、「C」いずれかのアルファベットを出力します。その後、Choice でアルファベットごとに処理を分けます(例:「出力A -> A_Process」)。

### Step Function のデザイン作成
AWS Step Functions サービスで「ステートマシンの作成」を選択し、テンプレートには「Blank」を選びます。ここから、ステートマシンの構築が始まります。

まず、Lambda 関数の部分にはアクションタブから「AWS Lambda Invoke」を追加します。そして、条件分岐を行う Choice の部分にはフロータブから「Choice Adds if-then-else logic.」を追加します。

ここで一つ注意点があります。Choice の次に Lambda Invoke を3つ配置したいのですが、デフォルトでは枠が二つしか用意されていません。この問題を解決するためには、ステートマシンの構成を工夫する必要があります。

![stepfunctions_graph (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/1772d0d0-4c36-9cfa-3dc3-4b83512d48b9.png)

このような場合は、Choiceの設定から[+ Add new choice rule]でルールを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/335f68ad-7dda-7a8a-09d8-6d42c5ff23d1.png)

今回は3つに分岐するので2つ追加して[Roule #3]まで作成します
。
[Default rule]の設定でDefault state を[Lambda Invoke(1)]にしていずれの条件にも一致しない場合は、一番左(A_Process)を実行するようにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/7a44c6d4-6287-87ff-e411-e7576761373d.png)

現在このようになっているはずです。
今はChoiceのエラーに関しては無視して大丈夫です。

![stepfunctions_graph (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/e10a6cb9-efd5-3d64-adfc-ce38825d409b.png)

最後に[Output Result]用の[Lambda Invoke]を配置します。
上手く配置できない場合は、[Lambda Invoke(1) ~ (3)]の設定にある[次の状態]をそれぞれ[Lambda Invoke(4)]にするときれいに配置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/be6104d4-74e0-4fab-f942-0fabf3b365be.png)

![stepfunctions_graph (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/dc323035-f488-1070-728a-ff2b413f8877.png)
後は、それぞれの処理に対して[状態名]を設定しておきます。
![stepfunctions_graph (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/8565e803-ad5b-2a8b-843d-75f63a904196.png)

### Lambda の作成
それぞれの処理に対してLambdaを作成します。

特に説明は不要とは思いますが、GenerateRandomAlphabetで['A', 'B', 'C']のいずれかを出力し、A or B or C_Process でそれぞれに合ったメッセージを返します。

OutputResultは受け取ったメッセージをログに表示します。

```JavaScript:GenerateRandomAlphabet
import { randomInt } from 'crypto';

export const handler = async (event) => {
    const choices = ['A', 'B', 'C'];
    const randomIndex = randomInt(choices.length);
    const randomValue = choices[randomIndex];
    
    return {"value": randomValue}
};
```
```JavaScript:A_Process
export const handler = async (event) => {
    
  return {"value": "A Processが呼び出されました。"}
};
```
```JavaScript:B_Process
export const handler = async (event) => {
    
  return {"value": "B Processが呼び出されました。"}
};
```
```JavaScript:A_Process
export const handler = async (event) => {
    
  return {"value": "C Processが呼び出されました。"}
};
```
```JavaScript:OutputResult
export const handler = async (event) => {
    console.log(`結果 ${JSON.stringify(event["value"], null, 2)}`);
};
```

### 各処理の設定
作成したLambdaと共に Step Function の各処理へ設定を行います。

各[Lambda Invoke]に対しては、設定のAPIパラメータの[Function name]に対応するLambdaを設定していきます(検索窓に入力すると絞り込めます)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/214de750-3f79-f35a-3008-2c1aa6b5198f.png)

[Choice]には設定の[Choice Rules]の各 Rule #1, #2, #3 に対して値(value)が該当する文字(#1=A, #2=B, #3=C)の条件を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/f2766e62-218d-ebee-64c3-78deee874f6d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/f3db7da8-09a8-ece7-64ef-b9bc7b80c277.png)

ここまでくれば右上の[作成]ボタンをおしてステートマシンを作成します。

### 設定と実行
Step Function の ステートマシンから作成したステートマシンを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/fe646906-dd39-9a30-0576-68af3de5d7b2.png)

IAMロールARN を押してStep Function からLambdaを呼び出す権限が必要なので[AWSLambda_FullAccess]を[許可を追加]から許可ポリシーへ追加しておきます。

ステートマシンの詳細画面へ戻って[実行を開始]を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/7f8cd582-1ddb-1e72-fc77-2d133e214952.png)

別画面が開きますが特に変更せずに[実行を開始]を押します。
下側にある [Event view|State view] の [State View] を選択して各処理の入力と出力を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/3d138c84-efef-bc28-560e-a9bd1b8c8915.png)

正しく値が渡されているのが確認できました。

CloudWatch からログの確認も行っておきます。

ロググループにいろいろありますが、最後のOutputResultを選択して確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517045/1c9c96ec-e759-9f98-78e0-3e302d7fdcc3.png)

ログにも B_Process の実行ログが出力されていました。これで、Step Function を使用した簡単な処理の分岐ができました。

今回作成した内容は助長的で、実際にはこのまま使用することは少ないかもしれません。しかし、Lambda と Choice の内容を変更することで、さまざまな処理を行える基盤として利用することができます。

発展的な例として、S3 にファイルが追加された際に、その中身を要約して DB に出力するフローを作成するのも面白いかもしれません。これにより、リアルタイムでデータ処理を自動化することが可能になります。

以上で、簡単な Step Function を使用した処理の分岐についての説明を終わります。皆さんもぜひ試してみてください。