
【VPC外リージョンサービス】
SNS(Amazon Simple Notification Service)は、Pub/Subモデル(Publish/Subscribe) に基づく通知サービスです。
Topic(トピック) に Message(メッセージ) を発行すると、Subscription(サブスクリプション) に登録された複数のエンドポイントへ自動的にファンアウト(配信)されます。対応する配信先には、HTTP/HTTPS、SQS(Simple Queue Service)、Lambda、Email 、SMS(Short Message Service)、 Application (mobile push) などがあります。
Message Filtering(メッセージフィルタリング) により、属性ベースで特定の条件に合致するメッセージのみを購読者に配信することができます。さらに、配信に失敗したメッセージを保持して後処理できる DLQ(Dead-Letter Queue) 機能も提供されています。
SNSはメッセージの暗号化(Encryption)や VPCエンドポイント を利用したセキュアな運用が可能であり、信頼性と可用性の高い通知基盤として多くのシステムで利用されています。
イベント駆動アーキテクチャの中心的な役割を担い、マイクロサービス間通信やアラート通知、リアルタイム連携など、幅広いユースケースで活用されています。
重要用語
ユースケース
| Pub/Subによるイベントファンアウト | 注文完了やユーザー登録などのイベントをSNSトピックに発行し、複数のシステム(Lambda、SQS、HTTPエンドポイント)がそれぞれ購読して別々の処理を行う。 |
| マイクロサービス間の疎結合通知 | あるサービス内で発生した出来事をSNSで通知し、他のサービスは通知を受け取ったときだけ処理を行うことで、直接の依存関係を減らす。 |
| メール・モバイル通知の中継基盤 | アプリケーションからの重要なお知らせやアラートをSNSトピックに送信し、メールやモバイルプッシュ通知へ配信する。 |
ベストプラクティス
| サブスクリプションフィルタポリシー | 不要なメッセージ配信を減らすために属性ベースのフィルタを設定する。 |
| 暗号化の有効化 | KMSと連携してトピックメッセージをサーバーサイドで暗号化する。 |
| 再試行ポリシーの調整 | エンドポイントの特性に合わせて再試行回数や間隔を設定する。 |
高可用性・バックアップ・リトライ
| 高可用性・バックアップ・リトライ設計のポイント |
|---|
| 【デフォルト】AWS内部で冗長化 ・メッセージ配信エンジン ・トピック定義・メタデータ ・サブスクリプション情報 ・メッセージの一時保存 ・配信ステータス管理 ・フィルタリングエンジン |
| 【自動リトライ】デフォルト 配信先ごとに自動リトライ機能がある HTTP / HTTPS(初回失敗後、最大 3 回、各 20 秒間隔:DeliveryPolicy で細かく指定可能) SQS / Lambda(合計 100,015 回、最長 23 日間リトライ:変更不可) SMS / モバイルプッシュ / Email(合計 50 回、6 時間以上かけてリトライ:変更不可) |
セキュリティ
| 関連サービス | 設定内容 |
|---|---|
| KMS(データの暗号化と鍵の安全管理) | 【トピックのメッセージの暗号化が必要】 独自KMSキーを使うことを推奨(鍵操作、監査) |
| Secrets Manager(機密情報の安全管理) | - |
| SSM Parameter Store(設定情報の一元管理) | - |
| CloudTrail(操作履歴の記録・監査・追跡) | 【自動記録】 作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI) データ操作は追跡できない(データプレーンAPI) |
| Config(リソースの構成状態・設定変更を記録) | 【Configが有効な場合】 トピック設定変更履歴・暗号化/ポリシー公開の準拠評価 |
| GuardDuty(脅威を自動検出) | 【GuardDutyが有効な場合】 トピック削除やサブスクリプション変更のAPI異常検知 |
リソースベースポリシーによる補完
実行ロールで不足する権限をSNS のリソースベースポリシーで補うパターン
| リソースベースポリシーのPrincipal | リソースベースポリシーのAction |
|---|---|
| 【S3】 s3.amazonaws.com | sns:Publish |
| 【CloudWatch】 cloudwatch.amazonaws.com | sns:Publish |
| 【RDS】 rds.amazonaws.com | sns:Publish |
| 【ElastiCache】 elasticache.amazonaws.com | sns:Publish |
| 【Backup】 backup.amazonaws.com | sns:Publish |
ログ・監視
| ログ出力先 | ログの種類 |
|---|---|
| CloudWatch Logs | 配信ステータスログ |
標準メトリクス
| メトリクス名 | 説明 |
|---|---|
| NumberOfMessagesPublished | 発行されたメッセージ数 |
| NumberOfNotificationsFilteredOut | フィルタリングで破棄された通知数 |
| PublishSize | パブリッシュされたメッセージサイズ合計 |
| HTTPFailure | HTTPエンドポイントへの失敗通知数 |
| HTTPSuccess | HTTPエンドポイントへの成功通知数 |
| NumberOfNotificationsDelivered | 配信成功通知数 |
| NumberOfNotificationsFailed | 配信失敗通知数 |
| NumberOfNotificationsFilteredOutInvalidAttributes | 無効属性によるフィルタ数 |
| NumberOfNotificationsRedrivenToDLQ | DLQへ再投入された通知数 |
| SMSMonthToDateSpentUSD | SMS課金額(月累計) |
制限値(固定値/ハードリミット/ソフトリミット)
| ハードリミット | 制限値 |
|---|---|
| メッセージサイズ | 最大256 KB |
| SMSメッセージの長さ | 140 Bytes(GSM-7)、70文字(UCS-2) |
| フィルターポリシーのサイズ | 256 KB |
| メッセージ属性数 | 10 |
| ソフトリミット | 制限値 |
|---|---|
| トピック数/アカウント | 100,000 |
| サブスクリプション数/トピック | 12,500,000 |
| 公開スループット | 30,000メッセージ/秒 |
AWS CLIのサンプルコード
CloudFormationのサンプルコード
Terraformのサンプルコード
料金計算
| 課金項目 | 説明 |
|---|---|
| リクエスト数 | Publish APIリクエスト数 |
| 通知配信 | 配信先プロトコル別の配信数 (HTTP、Email、SMSなど) |
| データ転送 | インターネットへのデータ転送 |