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 キューで使用して、厳密なメッセージの順序付けと重複排除を実現する方法について説明します。これは、ほぼリアル...
サポートするサブスクリプションプロトコル
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...
AWS CLI で SNS を使ってみる
AWS CLI を使ってトピックを作成し、メールアドレスをサブスクリプションとして登録してメッセージを発行するまでの流れを確認します。
トピックの作成
まずメッセージの配信先となるトピックを作成します。--name に指定した名前がトピック名になります。
❯ aws sns create-topic --name exrecord-topic
{
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:exrecord-topic"
}
作成されたトピックの ARN はサブスクリプション登録やメッセージ発行時に使用するため、控えておきましょう。
サブスクリプションの登録
次に、作成したトピックにメールアドレスを購読者として登録します。--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 が返されます。しばらく待つと登録したメールアドレスに通知が届くはずです。
サブスクリプションの削除
不要になったサブスクリプションは削除できます。--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 など多様なプロトコルをサブスクリプションとして登録でき、同一トピックに複数のプロトコルを組み合わせられる
- メッセージの発行は
sns publishコマンド 1 つで完了し、登録済みのすべてのサブスクライバーへリアルタイムに配信される - SQS と組み合わせることでメッセージのバッファリングや再処理が可能になり、より堅牢なアーキテクチャを構築できる