0
0

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

Last updated at Posted at 2024-07-17

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

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

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

image.png

今回は3つに分岐するので2つ追加して[Roule #3]まで作成します

[Default rule]の設定でDefault state を[Lambda Invoke(1)]にしていずれの条件にも一致しない場合は、一番左(A_Process)を実行するようにしておきます。

image.png

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

stepfunctions_graph (3).png

最後に[Output Result]用の[Lambda Invoke]を配置します。
上手く配置できない場合は、[Lambda Invoke(1) ~ (3)]の設定にある[次の状態]をそれぞれ[Lambda Invoke(4)]にするときれいに配置されます。
image.png

stepfunctions_graph (4).png
後は、それぞれの処理に対して[状態名]を設定しておきます。
stepfunctions_graph (5).png

Lambda の作成

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

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

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

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}
};
A_Process
export const handler = async (event) => {
    
  return {"value": "A Processが呼び出されました。"}
};
B_Process
export const handler = async (event) => {
    
  return {"value": "B Processが呼び出されました。"}
};
A_Process
export const handler = async (event) => {
    
  return {"value": "C Processが呼び出されました。"}
};
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

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

image.png

image.png

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

設定と実行

Step Function の ステートマシンから作成したステートマシンを開きます。

image.png

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

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

image.png

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

image.png

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

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

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

image.png

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

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0