イベントライフサイクルの管理:リトライ、DLQ、デスティネーション

AWS Lambda によるサーバーレスアプリケーション

Claudio Canales

Senior DevOps Engineer

イベントライフサイクルの概要

  • Lambda がハンドラーを呼び出します。
  • ハンドラーは成功または失敗します。
  • 失敗した場合、リトライとルーティングによって次の動作が決まります。

イベントライフサイクルのフロー

AWS Lambda によるサーバーレスアプリケーション

2 種類の失敗の現れ方

同期

  • 呼び出し元は待機し、エラーレスポンスを受け取ります。

非同期

  • 呼び出し元にはまず受信確認が返されます。
  • Lambda はバックグラウンドでリトライします。
  • 失敗時の処理は呼び出しモードによって異なります。

同期と非同期の失敗パス

AWS Lambda によるサーバーレスアプリケーション

リトライは正常な動作です

  • リトライは多くの場合、バグではなく有用な機能です。
  • 一時的な失敗は次の試行で成功することがあります。
  • リトライによって重複処理が発生する場合があるため、ハンドラーでその対策が必要です。

リトライの再接続アナロジー

AWS Lambda によるサーバーレスアプリケーション

時系列で見るリトライ

  • リトライにより一時的な問題から回復できます。
  • ただし、同じイベントが複数回実行される可能性があります。
  • 冪等性と明確なエラー処理が不可欠です。

リトライのタイムライン

AWS Lambda によるサーバーレスアプリケーション

リトライが危険になるケース

  • 処理が冪等でない場合、リトライはリスクになります。
  • 例:カード決済、メール送信など。
  • 冪等性キーと安全な更新処理を使い、重複による問題を防ぎましょう。

冪等性の目標

AWS Lambda によるサーバーレスアプリケーション

DLQ(デッドレタキュー)

  • リトライ後も失敗したイベントを安全に保管する場所です。
  • 多くの場合、AWS のマネージドメッセージキューである SQS キューが使われます。
  • ペイロードを確認し、原因を修正してから再処理します。

DLQ の遺失物保管アナロジー

AWS Lambda によるサーバーレスアプリケーション

DLQ とデスティネーションの違い

DLQ の遺失物保管アナロジー

  • リトライ後も失敗したイベントを保持します。
  • 調査目的で使用します。

デスティネーションのルーティング図

  • 成功・失敗に応じて結果をルーティングします。
  • 成功と失敗の処理パスを明示的に構築できます。
AWS Lambda によるサーバーレスアプリケーション

デスティネーション:成功と失敗のルート

  • 成功時は onSuccess に結果を送信します。
  • 失敗時は onFailure に詳細を送信します。
  • これにより、次のステップを明示的に定義できます。

デスティネーションのルーティング図

AWS Lambda によるサーバーレスアプリケーション

リトライポリシーのチューニング

  • Lambda のリトライ回数を調整できます。
  • イベントの最大保持期間を設定し、古いデータの処理を防ぎます。
  • リトライを増やすと信頼性は上がりますが、重複処理と遅延も増加します。

リトライポリシーの設定

AWS Lambda によるサーバーレスアプリケーション

イベントの最大保持期間:有効期限の設定

  • イベントの最大保持期間は有効期限ポリシーです。
  • 古すぎるイベントを処理しても意味がない場合があります。
  • トレードオフとして、古いイベントを減らし、タイムリーな処理を維持できます。

イベント有効期限切れのアナロジー

AWS Lambda によるサーバーレスアプリケーション

オブザーバビリティ:確認すべき場所

  • ログは何が起きたかを記録します。
  • メトリクスはどのくらいの頻度で発生しているかを示します。
  • アラームはスパイクを素早く検知するのに役立ちます。

ログとメトリクス

AWS Lambda によるサーバーレスアプリケーション

失敗したイベントへの対処方法

  • ペイロードとエラーを確認します。
  • 根本原因を修正します。
  • イベントを再処理し、エラーとスループットを監視します。

失敗イベントの復旧サイクル

AWS Lambda によるサーバーレスアプリケーション

まとめ

  • 信頼性はリトライ、ルーティング、オブザーバビリティによって実現します。
  • 同期エラーは呼び出し元に伝わります。
  • 非同期エラーにはリトライと DLQ またはデスティネーションが必要です。
  • これにより、失敗を可視化できます。

信頼性の構成図

AWS Lambda によるサーバーレスアプリケーション

練習しましょう!

AWS Lambda によるサーバーレスアプリケーション

Preparing Video For Download...