イベントライフサイクルの管理:リトライ、DLQ、デスティネーション
AWS Lambda によるサーバーレスアプリケーション
Claudio Canales
Senior DevOps Engineer
イベントライフサイクルの概要
Lambda がハンドラーを呼び出します。
ハンドラーは成功または失敗します。
失敗した場合、リトライとルーティングによって次の動作が決まります。
2 種類の失敗の現れ方
同期
呼び出し元は待機し、エラーレスポンスを受け取ります。
非同期
呼び出し元にはまず受信確認が返されます。
Lambda はバックグラウンドでリトライします。
失敗時の処理は呼び出しモードによって異なります。
リトライは正常な動作です
リトライは多くの場合、バグではなく有用な機能です。
一時的な失敗は次の試行で成功することがあります。
リトライによって重複処理が発生する場合があるため、ハンドラーでその対策が必要です。
時系列で見るリトライ
リトライにより一時的な問題から回復できます。
ただし、同じイベントが複数回実行される可能性があります。
冪等性と明確なエラー処理が不可欠です。
リトライが危険になるケース
処理が冪等でない場合、リトライはリスクになります。
例:カード決済、メール送信など。
冪等性キーと安全な更新処理を使い、重複による問題を防ぎましょう。
DLQ(デッドレタキュー)
リトライ後も失敗したイベントを安全に保管する場所です。
多くの場合、AWS のマネージドメッセージキューである SQS キューが使われます。
ペイロードを確認し、原因を修正してから再処理します。
DLQ とデスティネーションの違い
リトライ後も失敗したイベントを保持します。
調査目的で使用します。
成功・失敗に応じて結果をルーティングします。
成功と失敗の処理パスを明示的に構築できます。
デスティネーション:成功と失敗のルート
成功時は
onSuccess
に結果を送信します。
失敗時は
onFailure
に詳細を送信します。
これにより、次のステップを明示的に定義できます。
リトライポリシーのチューニング
Lambda のリトライ回数を調整できます。
イベントの最大保持期間を設定し、古いデータの処理を防ぎます。
リトライを増やすと信頼性は上がりますが、重複処理と遅延も増加します。
イベントの最大保持期間:有効期限の設定
イベントの最大保持期間は有効期限ポリシーです。
古すぎるイベントを処理しても意味がない場合があります。
トレードオフとして、古いイベントを減らし、タイムリーな処理を維持できます。
オブザーバビリティ:確認すべき場所
ログは何が起きたかを記録します。
メトリクスはどのくらいの頻度で発生しているかを示します。
アラームはスパイクを素早く検知するのに役立ちます。
失敗したイベントへの対処方法
ペイロードとエラーを確認します。
根本原因を修正します。
イベントを再処理し、エラーとスループットを監視します。
まとめ
信頼性はリトライ、ルーティング、オブザーバビリティによって実現します。
同期エラーは呼び出し元に伝わります。
非同期エラーにはリトライと DLQ またはデスティネーションが必要です。
これにより、失敗を可視化できます。
練習しましょう!
AWS Lambda によるサーバーレスアプリケーション
Preparing Video For Download...