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 の構成は以下の通りです。
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つ配置したいのですが、デフォルトでは枠が二つしか用意されていません。この問題を解決するためには、ステートマシンの構成を工夫する必要があります。
このような場合は、Choiceの設定から[+ Add new choice rule]でルールを追加します。
今回は3つに分岐するので2つ追加して[Roule #3]まで作成します
。
[Default rule]の設定でDefault state を[Lambda Invoke(1)]にしていずれの条件にも一致しない場合は、一番左(A_Process)を実行するようにしておきます。
現在このようになっているはずです。
今はChoiceのエラーに関しては無視して大丈夫です。
最後に[Output Result]用の[Lambda Invoke]を配置します。
上手く配置できない場合は、[Lambda Invoke(1) ~ (3)]の設定にある[次の状態]をそれぞれ[Lambda Invoke(4)]にするときれいに配置されます。
Lambda の作成
それぞれの処理に対してLambdaを作成します。
特に説明は不要とは思いますが、GenerateRandomAlphabetで['A', 'B', 'C']のいずれかを出力し、A or B or C_Process でそれぞれに合ったメッセージを返します。
OutputResultは受け取ったメッセージをログに表示します。
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}
};
export const handler = async (event) => {
return {"value": "A Processが呼び出されました。"}
};
export const handler = async (event) => {
return {"value": "B Processが呼び出されました。"}
};
export const handler = async (event) => {
return {"value": "C Processが呼び出されました。"}
};
export const handler = async (event) => {
console.log(`結果 ${JSON.stringify(event["value"], null, 2)}`);
};
各処理の設定
作成したLambdaと共に Step Function の各処理へ設定を行います。
各[Lambda Invoke]に対しては、設定のAPIパラメータの[Function name]に対応するLambdaを設定していきます(検索窓に入力すると絞り込めます)。
[Choice]には設定の[Choice Rules]の各 Rule #1, #2, #3 に対して値(value)が該当する文字(#1=A, #2=B, #3=C)の条件を指定します。
ここまでくれば右上の[作成]ボタンをおしてステートマシンを作成します。
設定と実行
Step Function の ステートマシンから作成したステートマシンを開きます。
IAMロールARN を押してStep Function からLambdaを呼び出す権限が必要なので[AWSLambda_FullAccess]を[許可を追加]から許可ポリシーへ追加しておきます。
ステートマシンの詳細画面へ戻って[実行を開始]を押します。
別画面が開きますが特に変更せずに[実行を開始]を押します。
下側にある [Event view|State view] の [State View] を選択して各処理の入力と出力を確認します。
正しく値が渡されているのが確認できました。
CloudWatch からログの確認も行っておきます。
ロググループにいろいろありますが、最後のOutputResultを選択して確認します。
ログにも B_Process の実行ログが出力されていました。これで、Step Function を使用した簡単な処理の分岐ができました。
今回作成した内容は助長的で、実際にはこのまま使用することは少ないかもしれません。しかし、Lambda と Choice の内容を変更することで、さまざまな処理を行える基盤として利用することができます。
発展的な例として、S3 にファイルが追加された際に、その中身を要約して DB に出力するフローを作成するのも面白いかもしれません。これにより、リアルタイムでデータ処理を自動化することが可能になります。
以上で、簡単な Step Function を使用した処理の分岐についての説明を終わります。皆さんもぜひ試してみてください。