SNS と SQS
AWS のメッセージングサービスで、SNS がパブリッシュ/サブスクライブ、SQS がメッセージキューを提供する
SNS と SQS とは
SNS (Simple Notification Service) はパブリッシュ/サブスクライブ型のメッセージングサービス、SQS (Simple Queue Service) はメッセージキューサービスである。SNS は「1 対多」の通知、SQS は「1 対 1」の非同期処理に使う。
SNS vs SQS
SNS と SQS はどちらか一方を選ぶ関係ではない。違いは配信の向き (押し出すか取りに行くか) とメッセージが残るかどうかの 2 点で、この 2 点が構成の選び方を決める。
| 観点 | SNS | SQS |
|---|---|---|
| モデル | Pub/Sub (1 対多) | キュー (1 対 1) |
| 配信 | プッシュ (SNS が宛先を呼び出す) | プル (コンシューマーが取得) |
| 永続化 | なし (配信のみ) | あり (既定 4 日・最大 14 日まで設定可) |
| 用途 | 通知、ファンアウト | 非同期処理、バッファリング |
プッシュ配信はその場で必ず完結するわけではない。宛先が一時的に応答しない (サーバー側エラー) 場合は再試行され、SQS や Lambda を宛先にした再試行は最大 100,015 回・23 日間にわたる。一方で宛先が削除済み・権限で拒否されるといったクライアント側エラーでは再試行せずに破棄する (いずれも 2026 年 8 月時点の公式ドキュメント)。SNS 自身はメッセージを保持しないため、再試行を使い切った時点で消える。ここが「永続化なし」の実務上の意味になる。
SNS + SQS ファンアウト
トピックへ 1 回発行すると、購読している各キューに独立した複製が入る。発行側は宛先を知らないため、購読を追加するだけで処理の系統を増やせる。
[注文サービス] → [SNS トピック] → [SQS: 在庫更新] → [Lambda: 在庫処理]
→ [SQS: メール送信] → [Lambda: メール処理]
→ [SQS: 分析] → [Lambda: 分析処理]
1 つのイベントを複数のコンシューマーに配信する。各 SQS キューが独立して処理するため、1 つが失敗しても他に影響しない。
受け取る形が 2 通りある
SNS から SQS へ配信されたメッセージは、既定では SNS の封筒に包まれる。Type や MessageId、TopicArn、Timestamp、署名などを含む JSON が届き、発行した本体は Message フィールドの中の文字列として入る。コンシューマー側で 2 段のパースが必要になり、封筒の形に依存したコードになりやすい。サブスクリプション属性 RawMessageDelivery を true にすると封筒が外れ、発行した本体がそのまま本文として届く。
切り替えると読み取り位置が変わるため、稼働後に変更するとコンシューマーが一斉に壊れる。キューを追加する時点で決めておく設定である。素の配信を有効にした SQS 宛サブスクリプションではメッセージ属性が 10 個までに制限され、これを超えるメッセージはクライアント側エラーとして破棄される (2026 年 8 月時点)。
デッドレターキュー (DLQ)
DLQ は置く場所が 2 か所ある。1 つは SNS のサブスクリプションに付ける DLQ で、SNS が宛先へ配信できなかったメッセージを受け止める。トピック単位ではなくサブスクリプション単位に付くため、どの宛先向けのメッセージが落ちたのかを区別できる。もう 1 つはキュー側の DLQ で、配信は成功したがコンシューマーが処理しきれなかったメッセージを受け止める。
前者を用意していないと、宛先の削除や権限変更で配信が失敗した時点でメッセージは黙って捨てられる。SNS 側の DLQ には同一アカウント・同一リージョンの SQS キューを指定し、FIFO トピックのサブスクリプションには FIFO キュー、標準トピックには標準キューを充てる。
EventBridge との使い分け
3 つはいずれもイベントを配る仕組みだが、選ぶ基準は経路の分岐条件をどこまで表現したいかにある。
| サービス | 用途 |
|---|---|
| SNS + SQS | シンプルなファンアウト、非同期処理 |
| EventBridge | イベントのフィルタリング、ルーティング |
| Kinesis | 大量データのストリーム処理 |
EventBridge の欄にフィルタリングと書いたが、SNS にもサブスクリプション単位のフィルターポリシーがあり、メッセージ属性と本文のどちらを見るかを指定して、条件に合わないメッセージを配信しない設定ができる。単純な振り分けだけなら SNS で足り、複数の条件を組み合わせた経路制御が必要になった段階で EventBridge を検討する。
基礎から学ぶなら関連書籍が手がかりになる。
この記事は役に立ちましたか?
関連用語
SNS ファンアウト
SNS トピックから複数の SQS キューや Lambda に同時配信し、1 つのイベントで複数の処理を並行実行するパターン
SQS FIFO キュー
メッセージの順序保証と厳密な 1 回配信を提供する Amazon SQS のキュータイプ
Kinesis
AWS のリアルタイムデータストリーミングサービスで、大量のデータを収集 / 処理 / 分析する
Pub/Sub
発行者と購読者が直接通信せず、メッセージブローカーを介して非同期にメッセージを交換するパターン
メッセージキュー
プロデューサーとコンシューマーを非同期に接続し、メッセージを一時的に保持する通信基盤
ファンアウト
1 つのイベントを複数のコンシューマーに同時配信するメッセージングパターン