AWS SNS vs SQS完全比較|メッセージング方式の違いと現場での使い分けガイド

Glossary Comparison

SNSとSQSのどちらを使えばいいか、調べても調べても「状況による」という答えばかりで、結局どっちを選べばいいか分からない——そう悩んだことはありませんか。

AWSでイベント駆動型の設計をしようとすると、必ずといっていいほど直面するのがこの問いです。オンプレの世界では、アプリ間の連携はAPIコールやDBのポーリングで済んでいたかもしれません。しかしクラウドで非同期処理やマイクロサービスを構築するとなると、メッセージングサービスの選択が設計の根幹を左右します。

この記事では、Amazon SNSとAmazon SQSをオンプレ経験者にも分かりやすく比較し、どんなシナリオでどちらを選ぶべきか、組み合わせて使う方法まで体系的に解説します。

AWS SNS vs SQS完全比較|メッセージング方式の違いと現場での使い分けガイド

Amazon SNSとAmazon SQSの基本概念

まず「そもそも何者か」を整理しておきましょう。名前が似ているため混同しがちですが、役割は全く異なります。

Amazon SNS(Simple Notification Service)とは

Amazon SNSは、プッシュ型のメッセージング・通知サービスです。「トピック」と呼ばれる仮想的なチャンネルにメッセージを投げると、そのトピックを購読(サブスクライブ)している宛先すべてに、一斉にメッセージが配信されます。

配信形式: プッシュ(送信側が主体的に配信)
配信先(サブスクライバー): SQSキュー、Lambda、HTTP/HTTPS、メールアドレス、SMS、モバイルプッシュ通知
メッセージの保持: 配信後は保持しない(配信失敗時は再試行ポリシーに従う)
代表的なユースケース: アラート通知、イベントのファンアウト配信、モバイルプッシュ

オンプレのアナロジーで言うと、「社内の一斉メール配信システム」に近いイメージです。1通のメールをトピックに送ると、登録者全員の受信箱に届く——そういう動きをします。

Amazon SQS(Simple Queue Service)とは

Amazon SQSは、プル型のメッセージキューサービスです。送信側がキューにメッセージを入れておき、受信側が自分のペースでメッセージを取り出す(ポーリングする)仕組みです。

配信形式: プル(受信側が主体的に取り出す)
配信先: キューにアクセスするコンシューマー(EC2、Lambda、ECS等)
メッセージの保持: コンシューマーが取り出すまで最大14日間保持
代表的なユースケース: 非同期ジョブ処理、バッファリング、マイクロサービス間の疎結合

オンプレのアナロジーで言えば、「社内の共有チケットシステム」です。誰かがチケットを登録しておき、担当者が空いたタイミングで取り出して処理する——そういう動きをします。

SNS vs SQS:7つの違いを一覧比較

両サービスの違いを整理すると、次のようになります。

比較ポイント Amazon SNS Amazon SQS
配信モデル プッシュ型(Pub/Sub) プル型(キュー)
受信者数 複数(1対多) 原則1(1対1)
メッセージ保持 保持しない 最大14日間保持
受信側の動作 即時プッシュ ポーリングで取得
順序保証 保証なし(FIFOトピックで保証) 標準キューは保証なし(FIFOキューで保証)
重複配信 可能性あり 標準キューで可能性あり(FIFOキューで排除)
主な用途 通知・イベント一斉配信 非同期ジョブ・処理バッファ

いつSNSを使い、いつSQSを使うべきか

「結局どっちを使えばいいの?」という疑問に正面から答えます。

Amazon SNSが向いているシナリオ

複数のシステムに同じイベントを同時に届けたい場合がSNSの本領です。

例えば「注文が完了したら、在庫システム・請求システム・通知システムの3つに同時に知らせる」という要件があるとします。SNSのトピックに「注文完了」メッセージを1回投げるだけで、3つのサブスクライバーに自動的に配信されます。送信元は宛先を意識する必要がありません。

EC2障害アラートをOpsチームのSlack・PagerDuty・メールに同時送信したい
新規ユーザー登録時に、ウェルカムメール・CRM登録・分析DBへの書き込みを並行実行したい
モバイルアプリにプッシュ通知を送りたい(iOS/Androidを問わず)

Amazon SQSが向いているシナリオ

処理速度が違うシステム間のバッファとして使いたい場合がSQSの出番です。

例えば画像アップロードサービスを考えます。ユーザーが大量に画像をアップロードすると、バックエンドのサムネイル生成処理が追いつかなくなります。SQSをバッファに挟むことで、アップロードAPI側はキューに入れるだけで即時レスポンスを返せ、サムネイル生成ワーカーは自分のペースで処理できます。

APIのリクエストを受け付けて、重い処理は非同期で行いたい(即時レスポンスを確保したい)
バッチ処理のジョブを溜めておいて、夜間に処理したい
コンシューマーがダウンしても、メッセージをロストしたくない(最大14日間の保持)
マイクロサービス間を疎結合にして、障害が連鎖しないようにしたい

ファンアウトパターン:SNS+SQSを組み合わせて使う

実務でよく使われるのが、SNSとSQSを組み合わせた「ファンアウトパターン」です。

SNSだけを使うと、配信先(LambdaやHTTPエンドポイント)が瞬間的に大量のメッセージを処理しきれない場合に問題が起きます。そこでSNSの配信先をSQSキューにすることで、メッセージをバッファリングしながら複数のシステムに届けられます。

設計イメージは次のとおりです。

# ファンアウトパターンの構成例 注文完了イベント │ ▼ SNSトピック(注文完了) ├── SQSキュー(在庫更新ワーカー向け) ├── SQSキュー(請求処理ワーカー向け) └── SQSキュー(通知ワーカー向け) # SNS → SQS のサブスクリプション設定(AWS CLIの例) aws sns subscribe \ --topic-arn arn:aws:sns:ap-northeast-1:123456789012:order-completed \ --protocol sqs \ --notification-endpoint arn:aws:sqs:ap-northeast-1:123456789012:inventory-queue

このパターンの利点は3つです。

イベントの一斉配信(SNSの強み): 1つのSNSトピックに送るだけで複数キューに配信される
処理速度の分離(SQSの強み): 各ワーカーが自分のペースでキューから取り出して処理できる
耐障害性の向上: 一部のワーカーがダウンしても、メッセージはSQSに保持されるのでロストしない

Eコマースや金融系のシステムで特に多用される設計パターンです。

SQSのFIFOキューとSNSのFIFOトピック

標準のSQSキューは処理順序が保証されません。これが問題になるケースがあります。例えば「口座残高を増やす処理」と「残高を減らす処理」が順序逆転すると、残高がマイナスになる可能性があります。

そのような場合はFIFOキュー(First In, First Out)を使います。

比較ポイント 標準キュー FIFOキュー
順序保証 なし(ベストエフォート) あり(厳密なFIFO)
重複排除 なし(少なくとも1回配信) あり(厳密に1回配信)
スループット 無制限 300 TPS(バッチで最大3,000 TPS)
命名規則 任意 .fifo サフィックスが必須
料金 低コスト 標準の約2倍

FIFOキューを使う場合は、メッセージにMessageGroupIdを付与する必要があります。同じグループ内ではFIFO順が保証されます。

# FIFOキューにメッセージを送信する(AWS CLIの例) # キュー名は必ず .fifo で終わる必要がある aws sqs send-message \ --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/payment-queue.fifo \ --message-body '{"action": "debit", "amount": 1000}' \ --message-group-id "account-12345" \ --message-deduplication-id "txn-abc-001"

料金の仕組み(コスト感覚)

どちらも月間100万リクエストまで無料で使えます(AWS無料利用枠)。

Amazon SNS の料金(2026年3月時点、東京リージョン)

APIリクエスト: 最初の100万回/月は無料、以降$0.50 / 100万リクエスト
SQSへの配信: 無料
HTTPへの配信: 100万回以降$0.60 / 100万回
SMSへの配信: 国によって異なる(日本向けは$0.07〜 / 通)
モバイルプッシュ: 最初の100万通/月は無料、以降$0.50 / 100万通

Amazon SQS の料金(2026年3月時点、東京リージョン)

標準キュー: 最初の100万リクエスト/月は無料、以降$0.40 / 100万リクエスト
FIFOキュー: 最初の100万リクエスト/月は無料、以降$0.50 / 100万リクエスト
データ転送: 同一リージョン内の転送は無料

注意点として、SQSはロングポーリングを使わずにポーリング頻度を高めると、APIリクエスト数が増えてコストが膨らみます。ロングポーリング(WaitTimeSeconds=20)を設定することで、空振りのポーリングを減らしコストを抑えられます。

現場でハマりがちなポイント

1. SNSからSQSへの配信はキューのアクセスポリシー設定が必要

SNSがSQSキューにメッセージを送るには、SQSキューのリソースポリシーでSNSからの送信を許可する必要があります。コンソールでサブスクリプションを作成すれば自動設定されますが、TerraformやCloudFormationで手動構築する場合は漏れやすいポイントです。

2. SQSの可視性タイムアウトとLambdaの実行タイムアウト

LambdaがSQSをトリガーとして処理する場合、Lambdaの実行タイムアウトよりもSQSの可視性タイムアウトを長く設定する必要があります。Lambdaのタイムアウトが可視性タイムアウト内で完了しない場合、同じメッセージが別のLambdaインスタンスに再配信されてしまいます。

推奨設定:可視性タイムアウト = Lambdaの最大実行時間 × 6

3. デッドレターキュー(DLQ)を設定しないと処理失敗メッセージが消える

SQSで処理に失敗したメッセージは、最大受信回数を超えるとキューから削除されます。DLQ(Dead Letter Queue)を設定しておくと、失敗したメッセージをDLQに移動して後から原因調査ができます。本番環境では必ず設定しましょう。

# DLQを設定したSQSキューの作成例(AWS CLIの例) # まずDLQ自体を作成 aws sqs create-queue --queue-name order-processing-dlq # 次にメインキューにDLQを紐付ける(最大受信数3回) aws sqs set-queue-attributes \ --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/order-processing \ --attributes '{ "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-northeast-1:123456789012:order-processing-dlq\",\"maxReceiveCount\":\"3\"}" }'

4. SNSからHTTPエンドポイントへ配信する場合、サブスクリプション確認が必要

SNSからHTTPS/HTTPのエンドポイントにサブスクリプションを作成した直後、エンドポイントには確認リクエスト(SubscribeURL付き)が送られます。エンドポイント側でこのURLにGETリクエストを投げて確認しないと、サブスクリプションが有効化されません。テスト環境での初期設定でよく詰まるポイントです。

よくある質問(FAQ)

Q: SNSでSQS以外に何を購読できますか?
A: Lambda、HTTP/HTTPS、メールアドレス、SMS、Amazon Kinesis Data Firehoseをサブスクライバーとして設定できます。モバイルプッシュ通知(APNs/FCM)にも対応しています。

Q: SQSはサーバーレス環境(Lambda)で使えますか?
A: はい。SQSをLambdaのイベントソースマッピングに設定することで、キューにメッセージが入ると自動でLambdaが起動します。この場合、LambdaがSQSのポーリングを内部的に行うため、コンシューマー側のポーリングコードを書く必要がありません。

Q: SQSメッセージの最大サイズはいくつですか?
A: 1メッセージあたり最大256KBです。それ以上のデータを送る場合は、実データをS3に保存してSQSにはS3のパスだけを送る「S3ポインター」パターンを使います。

Q: SNSでメッセージフィルタリングはできますか?
A: できます。サブスクリプションフィルターポリシーを設定することで、特定の属性を持つメッセージだけを特定のサブスクライバーに配信できます。例えば「region=tokyo」の属性があるメッセージだけを東京担当のSQSキューに届けるといった使い方ができます。

Q: オンプレのRabbitMQやActiveMQをAWSに移行する際、SQSに置き換えられますか?
A: 移行先としてAmazon MQも検討してください。Amazon MQはRabbitMQとActiveMQのマネージドサービスで、既存のメッセージングコードを最小限の変更で移行できます。SQSはAPIが異なるため、既存コードの修正が必要です。

本記事のまとめ

SNS(プッシュ型): 1つのイベントを複数のシステムに同時通知したいとき
SQS(プル型): 非同期処理のバッファとして、受信側のペースで消化させたいとき
SNS+SQSのファンアウトパターン: 複数システムへの配信+バッファリングが同時に必要なとき
FIFOキュー: 処理順序と重複排除が必須なとき(スループットの上限に注意)
DLQは本番必須: 処理失敗メッセージのロストを防ぐためにDLQは常に設定する

オンプレではアプリ間の連携に専用のメッセージングミドルウェアを自前で立てる必要がありましたが、AWSではSNSとSQSを組み合わせることで、フルマネージドなメッセージングインフラを数分で構築できます。

設計の第一歩として「受信側が複数か1つか」「メッセージをバッファリングする必要があるか」の2点を確認すると、SNSかSQSかの選択がスムーズになります。

Linuxサーバー上でPythonやJavaを使ったメッセージングの基礎については、姉妹サイトLinuxMaster.JPで詳しく解説しています。

クラウドの非同期設計、次は実践で身につけませんか?

SNS・SQSの概念は理解できても、実際のシステム設計となると「どこまでをSQSに任せるか」「FIFOが本当に必要か」の判断に迷うものです。
オンプレの経験を活かしながら、現場で使えるクラウドスキルを体系的に身につけたい方へ、メルマガで実践的なクラウド活用ノウハウをお届けしています。

コメント

タイトルとURLをコピーしました