はじめに
今回はワークフローにおけるエラーハンドリングを AWS で実現する際に、抑えておくべきポイントについて紹介します。
今回取り扱うワークフローは、ワークフロー全体で各々のステートが相互に整合性及び一貫性を持つ必要があるもの (ステート分散ワークフロー) と、大規模なデータ処理を行うものと 2 つになります。前編、後編に分けて、それぞれのパターンに対してのエラーハンドリングの手法についてご紹介します。
ステート分散ワークフローのユースケースでは、Saga パターンと分散トランザクションについてご説明していきます。本シリーズの オープニング記事 でもサーバーレスエラーハンドリングの基礎と絡めてご説明しておりますので、またご覧になられていない方は、そちらからご覧頂けると理解が深まると思います !
builders.flash メールメンバー登録
builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。
ユースケース
ワークフローパターンは、条件分岐を含むシーケンシャンルなステップの集合です。それらのハンドリングを一つのプログラムモジュールで実現しようとすると、条件判断や、エラーハンドリング、リトライ、などのビジネスロジック外の本質的ではないコードが多く記述されることになり、また単一のモジュールにすべての処理をまとめると、各々の処理が密結合になるリスクなどもあります。
こういったリスクを排除するために、ワークフローエンジンを利用し、各処理単位で独立したタスクに切り出したプログラムモジュールを組み合わせて、本質的ではないタスク間の連携処理については、ワークフローエンジンの設定や関数を利用することで、ワークフローが抱える複雑性を軽減させたりします。
切り出された各タスクは、本質的なビジネスロジック実行単位で独立していて、細かいプロビジョニングが可能になる点において、ワークフロー処理も、サーバーレスと相性の良いユースケースになります。
パターン特性
オーケストレーターとなる AWS サービス
AWS Step Functions で実現するエラーハンドリング
エラーハンドリングは、サーバーレスワークフロー管理ツールである AWS Step Functions でアプリケーションの信頼性を高める重要な要素です。本記事では、Step Functions を使用してエラーハンドリングを実現する方法を解説します。具体的には、ステートマシンの呼び出し側とステートマシン内でのエラーハンドリング方法に焦点を当てます。
まとめ
今回はステート分散ワークフローのユースケースにおけるエラーハンドリングについてご紹介しました。
ステート分散ワークフローパターンのサーバーレスアプリケーションの特性として、分散アプリケーション化することによって、可用性を担保しつつデータの論理的な一貫性を担保させることが難しくなる問題がありました。こういった問題に対し、ステートの一貫性を維持しながら並列実行を実現する Saga パターンを紹介しました。中でも、単一のトランザクションが複雑で、長期間に亘り多くのタスクを処理を行うワークフローに適しているオーケストレーション型のアプローチを利用する際のユースケースについて説明しました。
オーケストレーション型の Saga パターンの実装において、ワークフロー全体を制御する AWS のサービスとして、 Step Functions があります。Step Functions で実現するエラーハンドリング手法として大きく、Step Functions の呼び出し側と Step Functions 内でのエラーハンドリングの 2 つが有りました。
呼び出し側のエラーハンドリングについても、非同期的に起動される標準ワークフローにおける呼び出し時のエラーのハンドリングについては、非同期呼び出し元によるリトライの実施、またその後のイベントの破棄・退避を行う必要がありました。
Step Functions 内でのエラーハンドリングの場合は、リトライを行うか、エラーのキャッチを行い、適切なステートへの遷移するかのどちらかになります。正常フローにおけるエラーキャッチ後の遷移先の処理は、補償トランザクションのフローへの遷移、補償トランザクションの場合は、SNS や SQS を利用して、イベントの退避、及び通知を行います。またビジネスにおける論理的な整合性を担保するために、ロールバックを行わないフローの有無についても、フローのデザインの際に検討することを推奨します。
Step Functions は、今回紹介したような複数のタスク (業務機能) を横断してステート管理をするようなワークフロー用途だけではなく、大規模データ処理のフロー管理でも使われることがあります。次回はそのようなユースケースにおけるサーバーレスアプリケーションのエラーハンドリングについてご紹介します。
サーバーレス学習のための関連資料
筆者プロフィール
大磯 直人
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
インターネット・Web サービスを提供されるお客様に対して技術支援を行っています。好きな食べ物は 肉・寿司・ラーメン です。空き時間は永遠に YouTube を見ています。好きな AWS サービスは AWS StepFunctions です。
