Step Functions を用いた Lambda 関数のオーケストレーション
複数のタスクを管理したり、再試行ロジックを実装したり、分岐ロジックを含んだりする Lambda 関数は、いわゆるアンチパターンで好ましくありません。そのようなアプローチを避けて、それぞれ単一のタスクを実行する複数の Lambda 関数を記述し、AWS Step Functions を使用してアプリケーションのワークフローをオーケストレーションすることをお勧めします。
例えば、注文を処理するには、注文の詳細の確認、在庫レベルのチェック、支払の処理、請求書の生成が必要になる場合があります。それらのタスクそれぞれについて個別の Lambda 関数を記述し、Step Functions を使用してワークフローを管理します。Step Functions は各関数間のデータフローを調整し、各手順でエラーを処理します。この分離型アプローチにより、ワークフローが複雑になっても容易にワークフローを視覚化、変更、維持することができます。
Lambda で Step Functions を使用すべき状況
以下のシナリオは、Step Functions を使用して Lambda ベースの複数のアプリケーションをオーケストレーションすべき状況の例を示します。
シーケンシャル処理
シーケンシャル処理とは、あるタスクが完了してから、次のタスクを開始するアプローチを指します。例えば、注文処理システムでは、注文の確認が完了するまで支払処理を開始できず、請求書の生成は支払の確認を待つ必要があります。タスクごとに個別の Lambda 関数を記述し、Step Functions を使用してシーケンスを管理し、関数間のデータフローを調整します。
1 つの Lambda 関数で、注文処理ワークフロー全体を以下のように管理しています。
他の Lambda 関数を順番に呼び出す
各関数からのレスポンスを解析および検証する
エラー処理および復旧ロジックを実行する
関数間のデータフローの管理
2 つの Lambda 関数を使用しており、1 つは注文を確認し、もう 1 つは支払を処理するためのものです。Step Functions で、これらの関数を次のように調整します。
各タスクを正しい順序で実行する
関数間でのデータを受け渡しを行う
各手順でエラー処理を実行する
Choice 状態を使用して、有効な注文のみが支払に進むようにする
例 ワークフローのグラフ

複雑なエラー処理
Lambda は非同期呼び出しおよびイベントソースマッピングの再試行機能を提供しますが、これに対し Step Functions は複雑なワークフローに対してより高度なエラー処理を提供します。エクスポネンシャルバックオフを使用して自動再試行を設定し、さまざまなエラータイプに対してそれぞれ個別の再試行ポリシーを設定できます。再試行で解決できなかった場合、Catch
を使用してエラーをフォールバック状態にルーティングします。複数の関数およびサービスを調整するワークフローレベルのエラー処理が必要な場合、特に便利です。
ステートマシンでの Lambda 関数エラーの処理に関する詳細については、「AWS Step Functions ワークショップ」の「エラーの処理
1 つの Lambda 関数で、次のすべてを処理しています。
-
支払処理サービスの呼び出しを試行する
-
支払サービスが利用できない場合、関数は待機して後で再試行する。
-
待機時間のカスタムエクスポネンシャルバックオフを実装する
-
すべての試行が失敗したら、エラーをキャッチして別のフローを選択する。
そこで、支払処理のみを中心に扱う 1 つの Lambda 関数を使用します。Step Functions で次のようにエラー処理を管理します。
エラータイプに基づいて異なる再試行ポリシーを適用する
さまざまなエラーのタイプをそれぞれ適切なフォールバック状態にルーティングする
エラー処理の状態および履歴を維持する
例 ワークフローのグラフ

条件付きワークフローと人間による承認
Step Functions の Choice 状態を使用して関数の出力に基づいてワークフローをルーティングするとともに、人間の判断によりワークフローを一時停止できる waitForTaskToken サフィックスを使用します。例えば、クレジット上限の引き上げリクエストを処理するには、Lambda 関数を使用してリスク要因を評価します。次に、Step Functions を使用して高リスクのリクエストを手動承認にルーティングし、低リスクのリクエストを自動承認にルーティングします。
コールバックタスクトークンの統合パターンを使用するワークフローの例をデプロイするには、「AWS Step Functions ワークショップ」の「タスクトークンを使用したコールバック
1 つの Lambda 関数で、複雑な承認ワークフローを次のように管理しています。
ネストされた条件付きロジックを実装してクレジットリクエストを評価する
リクエスト金額に基づいて複数の異なる承認関数を呼び出す
複数の承認パスおよび決定ポイントを管理する
承認待ち状態を追跡する
承認用のタイムアウトおよび通知ロジックを実装する
これに対し、3 つの Lambda 関数を使用します。1 つは各リクエストのリスクを評価し、1 つは低リスクのリクエストを承認し、最後の 1 つは高リスクのリクエストを管理者によるレビューにルーティングします。Step Functions で次のようにこのワークフローを管理します。
Choice 状態を使用して、量およびリスクレベルに基づいてリクエストをルーティングする
人間による承認を待っている間は実行を一時停止する
承認待ちのタイムアウトを管理する
各リクエストの現在の状態を可視化する
例 ワークフローのグラフ

並列処理
Step Functions には、並列処理を行う 3 つの方法があります。
-
Parallel 状態は、ワークフローの複数の分岐を同時に実行します。画像メタデータ抽出中のサムネイル生成など、さまざまな関数を並行して実行する必要があるときに Parallel 状態を使用します。
-
Inline Map 状態は、最大 40 回の反復同時実行でデータ配列を処理します。Inline Map 状態は、各項目に対して同じオペレーションを実行する必要がある、小規模から中規模のデータセットに使用します。
-
Distributed Map 状態は、最大 10,000 回の同時実行で大規模な並列処理を行うもので、JSON 配列と Amazon Simple Storage Service (Amazon S3) データソースの両方をサポートします。Distributed Map 状態は、大規模なデータセットの処理や、より大量の同時実行に対応する必要がある場合に使用します。
1 つの Lambda 関数で、次のような並列処理の管理を行っています。
複数の画像処理関数を同時に呼び出す
カスタム並列実行ロジックを実装する
各並列タスクでタイムアウトおよびエラー処理を管理する
すべての関数の結果を収集および集計する
これに対し、3 つの Lambda 関数を使用します。1 つはサムネイルイメージを作成し、1 つはウォーターマークを付与し、最後の 1 つはメタデータを抽出します。Step Functions でこれらの関数を次のように管理します。
Parallel 状態を使用してすべての関数を同時に実行する
各関数の結果を収集し、順序付けられた配列にまとめる
すべての並列実行のタイムアウトおよびエラー処理を管理する
すべての並列分岐が完了した場合にのみ次に進む
例 ワークフローのグラフ

Lambda で Step Functions を使用すべきではない状況
すべての Lambda ベースのアプリケーションに Step Functions を使用するメリットがあるとは限りません。アプリケーションのアーキテクチャを選択する際、次のシナリオを検討してください。
単純なアプリケーション
複雑なオーケストレーションが不要なアプリケーションの場合、Step Functions を使用すると不要な複雑さにつながることがあります。例えば、Amazon SQS キューからのメッセージの処理や、Amazon EventBridge イベントに応答するのみのサービスであれば、Lambda 関数の直接呼び出しで対応できるでしょう。同様に、エラー処理が簡単な 1 つもしくは 2 つの Lambda 関数 で構成されるアプリケーションであれば、Lambda の直接呼び出し機能もしくはイベント駆動型アーキテクチャの方がデプロイもメンテナンスもしやすいでしょう。
複雑なデータの処理
Step Functions の Distributed Map 状態を使用することで、Lambda 関数で大規模な Amazon S3 データセットを同時に処理できます。この方法は、JSON ファイルや CSV ファイルなどの半構造化データの処理を含め、多くの大規模な並列ワークロードに効果的です。ただし、さらに複雑なデータ変換や高度な分析を要する場合は、次に説明する代替方法も検討してください。
-
データ変換パイプライン: AWS Glueを使用して、複数のソースからの構造化データまたは半構造化データを処理する ETL ジョブを構築します。AWS Glueは、ビルトインデータカタログやスキーマの管理機能が必要な場合に特に便利です。
-
データ分析: Amazon EMR を使用してペタバイト規模のデータ分析を行います。この方法は、Apache Hadoop エコシステムツールが必要な場合や、Lambda のメモリ制限を超える機械学習ワークロードに特に適しています。
CPU 負荷が高いワークロード
Step Functions は CPU 負荷が高いタスクもオーケストレーションすることができますが、Lambda 関数自体の CPU リソースが限られているためにこうしたワークロードには適していない場合があります。ワークフロー内のコンピューティング負荷が高いオペレーションについては、次の代替方法を検討してください。
-
コンテナオーケストレーション: Step Functions を使用して Amazon Elastic Container Service (Amazon ECS) タスクを管理し、一貫性がありスケーラブルなコンピューティングリソースを提供します。
-
バッチ処理: AWS Batch を Step Functions と統合し、継続的な CPU の使用を必要とするコンピューティング負荷の高いバッチジョブを管理します。