AWS SNS VISUALIZER

AWS SNS

Pub/Subモデルで複数のサブスクライバーにメッセージを同時配信するメッセージングサービス

シナリオ
1つのメッセージを複数のサブスクライバーに同時配信するファンアウトパターン
ステップ1 / 10
ステップ
① 全体像 — 注文イベントのファンアウト配信
ECサイトで注文が入ったとき「購入確認メールを送る」「在庫を減らす」「ログを保存する」の3つの処理が必要です。注文APIがSNSトピックに1回 Publish するだけで、3つのサブスクライバーに同時配信される仕組みを見ていきます。
SNS FANOUT DIAGRAM
注文APIからSNSトピック経由で複数サービスへファンアウト配信
STEP 1
CODE VIEW
── シナリオ: 注文イベントのファンアウト配信 ──
 
このシナリオでは、ECサイトで注文が
入ったとき、SNS を使って複数のサービスに
同時にメッセージを配信する仕組みを見ます。
 
フロー:
🛒 注文API(Publisher)
↓ 1回の Publish
📡 SNS トピック (order-events)
├→ 📧 メール通知 Lambda(購入確認メール)
├→ 📦 SQS キュー(在庫更新)
└→ 📝 ログ保存 Lambda(S3 に記録)
 
1回送るだけで3つのサービスに同時配信!
注文API / メール通知
SNS トピック
SQS キュー
解説

📢
SNS とは

Amazon SNS(Simple Notification Service)は、1つのメッセージを複数の宛先に同時に届けるためのPub/Sub(パブリッシュ/サブスクライブ)型メッセージングサービスです。身近なたとえでいうと「新聞配達」のような仕組みです。出版社(Publisher)が新聞を1部作れば、配達システムが全購読者(Subscriber)の家に届けてくれます。

SNSの中心にあるのがトピック(Topic)です。Publisherはトピックにメッセージを1回送るだけで、SNSがそのトピックに登録されている全Subscriberへ自動配信します。ラジオ局(Topic)が電波を1回発信すれば、チューニングしている全リスナー(Subscriber)に届くイメージです。

SQSとの決定的な違いはプッシュ型である点です。SQSはConsumerがキューをポーリング(引き取り)する「プル型」ですが、SNSはメッセージが来たら即座にSubscriberへ配信します。リアルタイム通知やファンアウト(1対多配信)に最適です。

Publisher送信者PublishSNS Topic1回 PublishSQS QueueLambdaEmail / SMS1回のPublishで全Subscriberに同時配信(プッシュ型)
SNS の主な特徴
- フルマネージド: サーバー管理不要、自動スケール
- プッシュ型配信: メッセージ到着即座に全Subscriberへ送信
- 多様なプロトコル: SQS, Lambda, HTTP/S, Email, SMS
- メッセージ非保持: 配信したら消える(バッファリングはSQSで)

SNS の特徴

SNSの最大の強みはファンアウト配信です。1つのトピックに複数のSubscriberを登録しておけば、1回のPublishで全員にメッセージが届きます。注文が入ったら、在庫サービス・メール通知・ログ記録の3つに同時配信、といった使い方が典型です。

もう1つの重要な機能がメッセージフィルタリングです。Subscriber側で「注文金額が10,000円以上のメッセージだけ受け取る」といった条件を設定できます。これにより、Subscriber側で不要なメッセージを捨てるロジックを書く必要がなくなります。

SNSにはStandard トピックFIFO トピックの2種類があります。Standardはほぼ無制限のスループットでベストエフォート順序、FIFOは厳密な順序保証とexactly-once配信を提供します。FIFO SNS → FIFO SQS の組み合わせで、順序保証付きファンアウトも実現可能です。

SNS TopicファンアウトSQSLambdaEmailHTTP/S1つのトピックに異なるプロトコルのSubscriberを混在可能
ファンアウト配信

1回のPublishで登録済みの全Subscriberに同時配信。新サービス追加時はSubscribeするだけで既存コードの変更不要。

メッセージフィルタリング

Subscriber側でフィルタポリシーを設定し、条件に合うメッセージだけを受信。不要なメッセージの処理コストを削減。

FIFO トピック対応

FIFO SNS + FIFO SQS の組み合わせで順序保証付きファンアウトを実現。金融取引のような厳密な順序が必要なユースケースに対応。

📨
プッシュ型配信 — SNS は「届けに行く」サービス

メッセージの受け渡しには大きく2つの方式があります。SNS を理解するうえで最も重要なポイントです。

SNS はプッシュ型です。メッセージが届いた瞬間にサブスクライバーに「届けに行く」ので、受信側がポーリング(取りに行く)する必要がありません。LINEの通知のように、送ったらすぐ相手のスマホに届くイメージです。

一方、SQS はプル型です。メッセージはキューに溜まっていて、コンシューマーが「取りに行く」必要があります。郵便受けに手紙が届くので自分で見に行くイメージです。

SNS(プッシュ型)SNS TopicLambdaSQSEmail← SNS が届けに行く受信側は何もしなくてOKSQS(プル型)SQS QueueConsumer← Consumer が取りに行くReceiveMessage で定期的にポーリングSNS = LINE通知(即座に届く) / SQS = 郵便受け(自分で見に行く)
SNS + SQS の組み合わせ: 実際の設計では SNS → SQS という組み合わせが非常に多いです。SNS がプッシュで SQS に投入し、コンシューマーが自分のペースでプルして処理する。プッシュの即時性とプルの安全性(バッファリング・リトライ)を両立できます。

📋
トピックとサブスクリプション — 登録の仕組み

SNS はトピック(Topic)サブスクリプション(Subscription)の2つで成り立っています。YouTube に例えると、トピックは「チャンネル」、サブスクリプションは「チャンネル登録」です。

トピックにメッセージを Publish すると、そのトピックに Subscribe しているすべてのサブスクライバーにメッセージが届きます。サブスクライバーはいつでも追加・削除でき、Publisher 側のコード変更は不要です。

PublisherPublishTopicorder-events= チャンネルLambda (メール)Protocol: Lambda | ✓ 確認済みSQS (在庫更新)Protocol: SQS | ✓ 確認済みLambda (ログ)Protocol: Lambda | ✓ 確認済みadmin@example.comProtocol: Email | ⏳ 確認待ち
トピック(Topic)= メッセージのチャンネル

トピックはメッセージの「中継点」です。ARN(arn:aws:sns:ap-northeast-1:123456:order-events)で一意に識別されます。Publisher はこの ARN 宛にメッセージを送るだけで、誰がメッセージを受け取るかは一切知りません。

サブスクリプション(Subscription)= チャンネル登録

トピックに「どのプロトコルで」「どの宛先に」配信するかを登録するものです。1つのトピックに SQS・Lambda・Email など異なるプロトコルを混在して登録でき、最大 1,250万件 まで登録できます。

確認プロセス(Confirmation)

Email / HTTP の場合、宛先の所有者が確認リンクをクリックするまでサブスクリプションは「Pending」状態です。SQS / Lambda / Kinesis Firehose は IAM ポリシーで権限を付与するだけなので確認不要で即座に有効になります。

対応プロトコル一覧
- SQS: キューにメッセージ送信(最も一般的なファンアウト先)
- Lambda: 関数を直接呼び出し(プッシュで即実行)
- HTTP/HTTPS: 任意の Web エンドポイントに POST
- Email / Email-JSON: メール送信(要確認)
- SMS: ショートメッセージ送信
- Kinesis Data Firehose: S3 / Redshift へストリーミング

🔀
Standard トピック vs FIFO トピック

SNS トピックにはStandard(標準)FIFO(先入れ先出し)の2種類があります。ほとんどのユースケースでは Standard で十分ですが、メッセージの順序が重要な場合や重複配信を防ぎたい場合は FIFO を選びます。

Standard トピック送信順: A → B → CCAB到着順: C → A → B(順不同)まれに重複配信ありスループット: ほぼ無制限FIFO トピック (.fifo)送信順: A → B → CABC到着順: A → B → C(順序保証)重複配信なし(Exactly-once)スループット: 300 msg/sStandard = 速度重視(順不同OK) / FIFO = 正確性重視(順序・重複なし保証)FIFO トピックのサブスクライバーは SQS FIFO キューのみ(Lambda / Email は不可)
StandardFIFO
順序保証なし(ベストエフォート)あり(送信順に配信)
重複配信まれに発生するなし(Exactly-once)
スループットほぼ無制限300 msg/s(バッチで3,000)
サブスクライバーSQS / Lambda / HTTP / Email / SMSSQS FIFO キューのみ
トピック名任意末尾に .fifo が必須
メッセージグループ非対応MessageGroupId で順序制御
重複排除非対応MessageDeduplicationId
料金$0.50 / 100万リクエスト$0.50 / 100万リクエスト
ユースケース通知・アラート・ファンアウト金融取引・注文処理・ワークフロー
Standard を選ぶケース

通知・アラート・ファンアウトなど、メッセージの順番が前後しても問題ないワークロード。ほとんどのユースケースはこちらです。「注文確認メールが5秒早く届いた」くらいは問題になりません。Lambda や Email にも配信でき、スループット制限もありません。

FIFO を選ぶケース

金融取引・注文処理のように「入金 → 出金」の順番が逆になると困る」ワークロード。重複配信も許されない場面です。ただしサブスクライバーは SQS FIFO キューのみに限定され、スループットも 300 msg/s が上限です。

SAA 試験のポイント: 「順序保証が必要」「重複を防ぎたい」→ FIFO。「大量の通知をファンアウトしたい」「Lambda に配信したい」→ Standard。FIFO トピックのサブスクライバーは SQS FIFO のみ、という制約もよく問われます。

🔍
メッセージフィルタリング

メッセージフィルタリングは、Subscriber側で受け取るメッセージを絞り込む仕組みです。トピックに大量のメッセージが流れていても、各Subscriberは自分に関係のあるメッセージだけを受信できます。たとえば「東京リージョンのエラーだけ通知してほしい」といった条件指定が可能です。

フィルタはフィルタポリシー(Filter Policy)としてサブスクリプションに設定します。メッセージの属性(MessageAttributes)を条件にマッチングし、条件に合致するメッセージだけがそのSubscriberに配信されます。フィルタポリシーがないSubscriberは全メッセージを受信します。

フィルタリングを使わない場合、Subscriber側で「自分に関係ないメッセージを捨てる」ロジックを書く必要があります。フィルタリングを使えばSNS側で選別が完了するため、Subscriber側のコードがシンプルになり、不要なメッセージ処理コスト(Lambda呼び出し回数など)も削減できます。

Topic全メッセージFilterregion = tokyolevel = errorMatching Sub ✓条件に合致 → 配信Non-matching Sub条件不一致 → スキップ
フィルタポリシーの具体例
// サブスクリプションのフィルタポリシー
{
"event_type": ["order_placed"],
"amount": [{"numeric": [">=", 10000]}]
}
// → 注文イベントかつ金額10,000以上のみ受信

⚖️
SNS vs SQS vs EventBridge

項目SNSSQSEventBridge
パターンPub/SubQueueEvent Bus
配信方式プッシュ(1:N)プル(1:1)プッシュ(1:N)
主な用途ファンアウト通知バッファリングイベント駆動
順序保証FIFOで可能FIFOで可能なし
フィルタ属性ベースなしルールベース(強力)
メッセージ保持なし最大14日なし
定番: SNS + SQSAppSNSSQSEventBridgeEvent BusSNS+SQS: シンプルなファンアウト / EventBridge: 複雑なイベントルーティング3つは競合ではなく組み合わせて使うことも多い
よくある組み合わせパターン
- SNS + SQS: ファンアウト + バッファリング(最も一般的)
- EventBridge + SNS: 複雑なルール判定後に通知
- EventBridge + SQS: スケジュール実行のキューイング
- SNS単体: リアルタイムメール/SMS通知

📝
AWS 認定試験(SAA)レベルの問題

Q1.注文サービスが注文イベントを発行するとき、在庫サービス・通知サービス・監査サービスの3つが独立して処理できるようにしたいです。最も適切なアーキテクチャはどれですか?
A.注文サービスが3つのサービスのAPIを直接呼び出す
B.SNSトピックに3つのSQSキューをサブスクライブし、各SQSキューを各サービスが処理する
C.1つのSQSキューに3つのサービスが並行してポーリングする
D.EventBridgeルールで3つのLambdaを直接起動する
Q2.SNSトピックに大量のメッセージが流れていますが、特定のSubscriberは「region=ap-northeast-1」のメッセージだけを処理したいです。最も運用コストが低い方法はどれですか?
A.Subscriber側のアプリケーションで不要なメッセージをフィルタリングして捨てる
B.リージョンごとに別のSNSトピックを作成する
C.サブスクリプションにフィルタポリシーを設定し、SNS側で配信を制御する
D.EventBridgeルールでフィルタリングしてからSNSに転送する
Q3.SNS → SQS のファンアウト構成で、あるSQSキューのConsumerが一時的にダウンしました。この間に送信されたメッセージはどうなりますか?
A.SNSがメッセージを保持し、Consumer復旧後に再配信する
B.メッセージは消失し、二度と取得できない
C.SNS → SQSの配信は成功するため、SQSキュー内にメッセージが保持され、Consumer復旧後にポーリングで取得できる
D.SNSが自動的にConsumerを再起動する

関連コンテンツ

AWS SNS | Vizigo