AWS DVA / 第4章

CHAPTER 04 / D1 / D4

イベント駆動と非同期処理

SQS・SNS・EventBridgeと、失敗時の動きを整理する。

一読の目安 30分図・具体例・確認問題

01 / 非同期サービスを目的で選ぶ

サービス中心となる役割設問の手がかり
SQS処理待ちのメッセージをキューに保持負荷を平準化、ワーカーで分担、処理失敗の再試行
SNS一つの通知を複数の購読先へ配信ファンアウト、複数のSQSやLambdaへ同じ情報を渡す
EventBridgeイベントの内容に応じて配送先を決めるAWS / SaaS / 独自アプリのイベント、パターンによる振り分け
Kinesis Data Streams連続したデータを保持して読み取るストリーミング、同じデータを複数の利用者が読む、再処理
Step Functions複数ステップの実行を管理する分岐・並列・待機・再試行・失敗処理を一つのワークフローに
SNS+SQSのファンアウト注文イベントをSNSへ一度発行し、メール用と在庫用のSQSへ配送します。各ワーカーは独立した速度と再試行設定で処理できます。注文処理イベントを発行SNS購読先へ配信SQS / メールメール処理用SQS / 在庫在庫処理用ワーカーAメール送信ワーカーB在庫更新
SNS+SQSのファンアウト — 注文イベントをSNSへ一度発行し、メール用と在庫用のSQSへ配送します。各ワーカーは独立した速度と再試行設定で処理できます。

02 / SQSの一件は、いつ消える?

通常のSQS APIでは、受信しただけではメッセージは消えません。受信後は可視性タイムアウトの間だけ見えにくい状態となり、処理に成功したらDeleteMessageします。Lambdaのイベントソースマッピングでは、バッチ成功時の削除をLambda側が行います。

可視性タイムアウトと再配送ワーカーAが受信したメッセージを削除しないまま期限が過ぎると、再び受信できる状態になります。処理中の重複や再配送に備え、処理は冪等にします。可視性タイムアウト受信・処理を開始未削除のまま期限切れ再び受信できる成功したら削除。長い処理では可視性の延長も検討。
可視性タイムアウトと再配送 — ワーカーAが受信したメッセージを削除しないまま期限が過ぎると、再び受信できる状態になります。処理中の重複や再配送に備え、処理は冪等にします。
設定何を制御するか
Visibility timeout受信したメッセージが再び見えるまでの時間。処理時間より短いと重複処理の原因
Message retention periodメッセージを保持する期間。可視性タイムアウトとは別
ReceiveMessageWaitTimeSecondsロングポーリングの待ち時間。空の応答を減らす
Redrive policy / maxReceiveCount受信が繰り返されたメッセージをDLQへ移す基準

Lambdaとの連携では、可視性タイムアウトを関数タイムアウトの少なくとも6倍にすることが推奨されます。バッチウィンドウを設定している場合は、その時間も加味します。単に関数タイムアウトより長ければ十分、と覚えないようにします。

公式資料:Lambda と SQS の設定

03 / StandardとFIFOを分ける

比較StandardFIFO
順序ベストエフォート。厳密な順序を保証しない同じMessageGroupId内で順序を維持
重複少なくとも一回の配送。重複し得る重複排除ID等で送信時の重複を抑止。排除期間は5分
並列性多数のワーカーで分担異なるメッセージグループは並列に処理できる
アプリの処理冪等性が必要タイムアウトや削除前の障害に備え、やはり冪等性を考える

FIFOの重複排除は「外部の決済が必ず一度だけ実行される」保証ではありません。決済成功後、メッセージ削除前にワーカーが停止すれば、再処理され得ます。また、一つのMessageGroupIdへ集中させると、そのグループ内の直列性がボトルネックになります。

公式資料:FIFO の重複排除

04 / バッチ処理と失敗の切り分け

SQSのバッチで一件だけ失敗しても、既定ではバッチ全体が失敗扱いになるため、成功したメッセージまで再配送されます。部分バッチ応答を有効にすると、失敗したメッセージIDだけを返せます。

SQS 部分バッチ応答の形式(JSON)
{
  "batchItemFailures": [
    {"itemIdentifier": "失敗したメッセージのmessageId"}
  ]
}

イベントソースマッピングにReportBatchItemFailuresを設定し、関数がこの形式で応答する必要があります。FIFOでは順序を守るため、最初の失敗後の未処理メッセージの扱いにも注意します。

KinesisやDynamoDB Streamsでは、失敗したバッチがシャードの処理を遅らせることがあります。分割して再試行する設定、再試行回数・レコード有効期間、失敗先を検討し、IteratorAgeで遅延を見ます。

公式資料:SQS バッチ失敗の扱い

05 / EventBridge・Kinesis・Step Functions

EventBridgeでは、イベント内のsource、detail-type、detailなどに基づくルーティングを学びます。Pipesは一つのソースから一つのターゲットへの連携で、フィルタリングやエンリッチメントに使えます。Schedulerはスケジュールに基づく起動に使います。

Kinesis Data Streamsでは、partition keyでシャードへの振り分けが決まります。シャード内の順序や読み取り位置を意識し、キーの偏りとコンシューマーの処理遅延を調べます。キューのように一人が読んだら全員から消えるモデルではありません。

Step Functionsは、各Lambdaが次のLambdaを呼ぶコードを抱える代わりに、分岐・並列・待機・Retry・Catchを状態機械として表現します。

ワークフロー選択の目安実行モデル
Standard長時間・実行履歴・コールバック待機など最大1年。ワークフローはexactly-once。ただし明示的なRetryでタスクを再実行し得る
Asynchronous Express大量・短時間の非同期処理最大5分。at-least-once
Synchronous Express短時間で結果を同期取得したい処理最大5分。at-most-once

公式資料:Standard と Express の比較

構成練習:メール障害でも受注したい

受注後のメールサーバーが一時的に落ちても、受注APIは素早く成功を返したい。どこを分離する?

考え方・解答例

受注データを確実に保存し、メール処理をSQS等へ渡して別ワーカーで実行します。保存とイベント送信の片方だけ成功する問題もあるため、必要ならStreamsやトランザクショナル・アウトボックスなどの設計を検討します。キューだけ追加しても、この二重書き込み問題は自動解決しません。

06 / 確認問題

QUESTION 4-1 · 単一選択受信したメッセージを処理中に、別のワーカーが同じメッセージを受け取った。まず疑う設定は?
解答・解説を読む

正解:B
可視性が戻る前に処理・削除が終わらないと、別の受信が可能になります。ただし、Standardでは可視性期間中も重複を絶対には排除できないため、冪等性も必要です。

QUESTION 4-2 · 単一選択メール担当と分析担当が、すべての注文イベントをそれぞれ受け取りたい。適切な構成は?
解答・解説を読む

正解:B
SNSのファンアウトで専用キューへ配信すれば、両担当が独立して全イベントを処理できます。一つのSQSでは通常、メッセージを分担します。

07 / この章の到達点

上のチェックは、このページでの振り返り用です。章単位の進捗は下のボタンで記録できます。

公式資料

内容確認日:2026年11月8日。仕様の詳細や更新情報は、各公式資料で確認できます。

おつかれさまでした。

理解を確認できたら、章の進捗を記録できます。