Amazon SNS とは?トピックへのメッセージ発行を学ぼう
アプリケーション間でイベントや通知をリアルタイムに届けたい場面は多くあります。Amazon SNS はそのためのフルマネージドな通知サービスで、1 つのメッセージを複数の宛先に同時配信するファンアウトパターンを簡単に実現できます。本記事では SNS の基本概念から AWS CLI を使ったトピックの作成・メッセージ発行までの手順を説明します。
Amazon SNS とは
Amazon SNS(Simple Notification Service)は AWS が提供するフルマネージドの pub/sub メッセージングサービスです。メッセージを送る側(パブリッシャー)がトピックにメッセージを発行すると、そのトピックを購読しているすべての宛先(サブスクライバー)にメッセージが届けられます。サーバーの管理やメッセージキューのポーリングが不要で、イベント駆動アーキテクチャを低コストで構築できます。
主なユースケースとして、アプリケーションからのアラート通知、マイクロサービス間のイベント配信、Lambda や SQS との連携によるサーバーレスワークフローなどがあります。
Amazon SNS とは - Amazon Simple Notification Service
このトピックでは、Amazon SNS の概要と、Amazon SNS によってパブリッシャーとサブスクライバー間の非同期メッセージ配信を実現する方法について説明します。メッセージ配信でサポートされて...
トピックの種類
SNS のトピックには Standard と FIFO の 2 種類があります。用途に応じて使い分けましょう。
| 種類 | 順序保証 | 重複排除 | スループット |
|---|---|---|---|
| Standard | なし(ベストエフォート) | なし(重複配信の可能性あり) | ほぼ無制限 |
| FIFO | あり(送信順に配信) | あり(重複排除 ID で制御) | 最大 300 件/秒(バッチ時 3,000 件/秒) |
順序や重複が問題になるユースケースでは FIFO トピックを選びましょう。一方、ログ収集やアラート通知のように高スループットが求められる場合は Standard トピックが向いています。
Amazon SNS FIFO トピックを使用したメッセージの順序付けと重複排除戦略 - Amazon Simple Notification Service
Amazon SNS FIFO (先入れ先出し) トピックを Amazon SQS FIFO キューで使用して、厳密なメッセージの順序付けと重複排除を実現する方法について説明します。これは、ほぼリアル...
似たサービスに Amazon SQS がありますが、役割が異なります。SNS は 1 つのメッセージを複数の購読者に同時配信する Pub/Sub 型のサービスで、SQS はメッセージを一時的に蓄えるキュー型のサービスです。SNS には配信先ごとに個別のキューを持たせる仕組みがないため、複数のコンシューマーそれぞれにメッセージを届けたい場合は、SNS トピックの配下に複数の SQS キューを紐づけるファンアウト構成がよく使われます。
サポートするサブスクリプションプロトコル
SNS はさまざまな宛先へのメッセージ配信をサポートしています。1 つのトピックに複数のプロトコルのサブスクリプションを登録でき、メッセージ発行時にすべての宛先へ同時配信されます。
| プロトコル | 配信先 | 主なユースケース |
|---|---|---|
| Email / Email-JSON | メールアドレス | 人への通知・アラート |
| HTTP / HTTPS | Web エンドポイント | 外部サービスへの Webhook |
| SQS | SQS キュー | 非同期処理・メッセージバッファリング |
| Lambda | Lambda 関数 | サーバーレスなイベント処理 |
| SMS | 携帯電話番号 | SMS 通知 |
| Application | モバイルプッシュ通知エンドポイント | iOS / Android へのプッシュ通知 |
| Firehose | Amazon Data Firehose | ログ・データのストリーミング |
Subscribe - Amazon Simple Notification Service
Subscribes an endpoint to an Amazon SNS topic. If the endpoint type is HTTP/S or email, or if the en...
メッセージフィルタリング
1 つのトピックに複数のサブスクライバーを登録していても、すべての購読者が同じメッセージを必要とするとは限りません。SNS にはサブスクリプションフィルターポリシーという仕組みがあり、メッセージ属性の内容に応じて配信先を絞り込めます。
たとえば注文イベントを配信するトピックで、あるサブスクライバーには「注文金額が 1 万円以上」のメッセージだけを届けたい場合、そのサブスクリプションにフィルターポリシーを設定します。フィルター条件に一致しないメッセージはそのサブスクライバーには配信されず、他の購読者への配信には影響しないです。配信先ごとに必要なメッセージだけを受け取れるため、受信側でのメッセージ選別処理を減らせます。
Amazon SNS メッセージフィルター処理 - Amazon Simple Notification Service
Amazon SNS メッセージフィルタリングにより、トピックサブスクリプションにフィルターポリシーを適用して、サブスクライバーが特定のメッセージのみを受信できるようにする方法について説明します。フィ...
アクセス制御(トピックポリシー)
トピックには JSON 形式のトピックポリシーをアタッチして、誰がメッセージを発行・購読できるかを制御できます。デフォルトではトピックの作成者のみがアクセスできますが、別の AWS アカウントからの発行を許可したり、特定の AWS サービスからの発行のみを許可するといった制御が可能です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic"
}
]
}
たとえば S3 のイベント通知を SNS トピックに送りたい場合、S3 サービスからの発行を許可するトピックポリシーが必要になります。IAM ポリシーだけでは他の AWS サービスからのアクセスを制御できないため、サービス間連携を行う際はトピックポリシーの設定を忘れないようにしましょう。
AWS CLI で SNS を使ってみる
AWS CLI を使ってトピックを作成し、メールアドレスをサブスクリプションとして登録してメッセージを発行するまでの流れを確認します。
トピックの作成
まずメッセージの配信先となるトピックを作成します。--name に指定した名前がトピック名になります。
❯ aws sns create-topic --name exrecord-topic
{
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic"
}
作成されたトピックの ARN はサブスクリプション登録やメッセージ発行時に使用するため、控えておきましょう。
アカウント内に作成済みのトピックは、以下のコマンドで一覧を取得できます。
❯ aws sns list-topics
{
"Topics": [
{
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic"
}
]
}
サブスクリプションの登録
次に、作成したトピックにメールアドレスを購読者として登録します。--protocol に email、--notification-endpoint に受信するメールアドレスを指定します。
❯ aws sns subscribe \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic \
--protocol email \
--notification-endpoint you@example.com
{
"SubscriptionArn": "pending confirmation"
}
登録直後は pending confirmation 状態です。指定したメールアドレスに確認メールが届くので、メール内の「Confirm subscription」リンクをクリックして購読を確定させましょう。
確認が完了したら、以下のコマンドでサブスクリプションの状態を確認できます。
❯ aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic
{
"Subscriptions": [
{
"SubscriptionArn": "arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic:0a1b2c3d-4e5f-6789-abcd-0a1b2c3d4e5f",
"Owner": "123456789012",
"Protocol": "email",
"Endpoint": "you@example.com",
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic"
}
]
}
SubscriptionArn が ARN 形式になっていれば、購読が確定されています。
メッセージの発行
トピックにメッセージを発行すると、登録済みのすべてのサブスクライバーにメッセージが配信されます。--message にメッセージ本文を指定します。
❯ aws sns publish \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic \
--subject "テスト通知" \
--message "SNS からのテストメッセージです。"
{
"MessageId": "0a1b2c3d-4e5f-6789-abcd-0a1b2c3d4e5f"
}
発行が成功すると MessageId が返されます。しばらく待つと登録したメールアドレスに通知が届くはずです。
トピック属性の確認
トピックの現在の設定を確認したい場合は get-topic-attributes を使います。アタッチされているトピックポリシーや、購読中のサブスクリプション数などをまとめて確認できます。
❯ aws sns get-topic-attributes --topic-arn arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic
{
"Attributes": {
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic",
"SubscriptionsConfirmed": "1",
"SubscriptionsPending": "0",
"Policy": "{\"Version\":\"2008-10-17\", ...}"
}
}
サブスクリプションの削除
不要になったサブスクリプションは削除できます。--subscription-arn に削除対象のサブスクリプション ARN を指定します。
❯ aws sns unsubscribe \
--subscription-arn arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic:0a1b2c3d-4e5f-6789-abcd-0a1b2c3d4e5f
トピックの削除
不要になったトピックは削除しましょう。トピックを削除すると、紐づくサブスクリプションもすべて削除されます。
❯ aws sns delete-topic \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic
まとめ
Amazon SNS の基本概念と AWS CLI を使ったトピックの作成・サブスクリプション登録・メッセージ発行の手順について説明しました。
- SNS はフルマネージドな pub/sub メッセージングサービスで、1 つのメッセージを複数の宛先へ同時配信するファンアウトパターンを簡単に実現できる
- トピックには Standard(高スループット)と FIFO(順序保証・重複排除)の 2 種類があり、ユースケースに合わせて選ぶとよい
- Email・SQS・Lambda・SMS など多様なプロトコルをサブスクリプションとして登録でき、同一トピックに複数のプロトコルを組み合わせられる
- メッセージの発行は 1 回のコマンド実行で完了し、登録済みのすべてのサブスクライバーへリアルタイムに配信される
- フィルターポリシーを使えば、メッセージ属性に応じて配信先ごとに必要なメッセージだけを届けられる
- トピックポリシーを設定することで、他の AWS アカウントやサービスからの発行・購読を制御できる
- SQS と組み合わせることでメッセージのバッファリングや再処理が可能になり、より堅牢なアーキテクチャを構築できる