Amazon SNS で HTTP/S エンドポイントをサブスクライブしてみた

できることは知ってるけど実際にやったことはなかったので、やってみました。
2022.11.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アノテーション株式会社の hato です。

Amazon SNS では HTTP または HTTPS エンドポイントにメッセージを送信できますが、実際に設定したことはなかったのでやってみました。

HTTP/S エンドポイントへのファンアウト - Amazon Simple Notification Service

Amazon SNS を使用して、1 つ以上の HTTP または HTTPS エンドポイントに通知メッセージを送信できます。

HTTP/S エンドポイントについて

  • HTTP もしくは HTTPS が選択できます。
  • メッセージは POST リクエストで送信されます。
  • サブスクライブを行うと、確認のためSubscribeURLが含まれるリクエストが SNS から送信されるのでSubscribeURLにアクセスする必要があります。
    • SubscribeURLの確認ができ次第、メッセージが送信されるようになります。

確認リクエストのサンプル

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
  "Token" : "2336412f37f...",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...",
  "Timestamp" : "2012-04-26T20:45:04.751Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEpH+...",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}

やってみた

前提

  • SNS トピックは作成済
  • メッセージ受信用にパブリックサブネットに EC2 を作成済

構成図

手順

  1. メッセージ受信用のアプリケーション作成
  2. エンドポイントのサブスクライブ
  3. メッセージの通知確認

メッセージ受信用のアプリケーション作成

EC2 に Python で簡単な HTTP ウェブサーバを起動します。

※ 80 ポートへの POST リクエストを標準出力に表示するサンプルコードです。何も表示されませんが、そのままで次の手順を実行してください。

参考:デバッグ用HTTP ServerをPythonで起動する | エンジニアっぽいことを書くブログ

$ python -c "import BaseHTTPServer
class Handle(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_POST(self):
        content_len = int(self.headers.getheader('content-length', 0))
        post_body = self.rfile.read(content_len)
        print(post_body)
        self.send_response(200)
BaseHTTPServer.HTTPServer(('', 80), Handle).serve_forever()"

エンドポイントのサブスクライブ

Amazon SNS コンソール のナビゲーションペインから「サブスクリプションの作成」を選択します。

次の値を指定して「サブスクリプションの作成」を選択します。

  • トピック ARN:関連付けを行う SNS トピックを選択
  • プロトコル:HTTP
  • エンドポイント:任意の URL(例:EC2 の IP アドレス)

サブスクリプションが正常に作成されたことを確認します。

エンドポイント(EC2) を確認すると、SubscribeURLを含むリクエストを受信しているので、SubscribeURLをクリックボードにコピーします。

$ python -c "import BaseHTTPServer
class Handle(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_POST(self):
        content_len = int(self.headers.getheader('content-length', 0))
        post_body = self.rfile.read(content_len)
        print(post_body)
        self.send_response(200)
BaseHTTPServer.HTTPServer(('', 80), Handle).serve_forever()"

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
  "Token" : "2336412f37f...",
  "TopicArn" : "arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic&Token=2336412f37f...",
  "Timestamp" : "2012-04-26T20:45:04.751Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEpH+...",
  "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
54.240.200.6 - - [01/Nov/2022 01:01:01] "POST / HTTP/1.1" 200 -

SubscribeURLにブラウザでアクセスして、エンドポイントを確認します。

ステータスが「確認済み」になることを確認します。

メッセージの通知確認

「メッセージの発行」を選択します。

テストメッセージを入力して「メッセージの発行」を選択します。

エンドポイントにメッセージが配信されました。

$ python -c "import BaseHTTPServer
class Handle(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_POST(self):
        content_len = int(self.headers.getheader('content-length', 0))
        post_body = self.rfile.read(content_len)
        print(post_body)
        self.send_response(200)
BaseHTTPServer.HTTPServer(('', 80), Handle).serve_forever()"

{
  "Type" : "Notification",
  "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324",
  "TopicArn" : "arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic",
  "Subject" : "hato-test-title",
  "Message" : "hato-test-Message",
  "Timestamp" : "2012-05-02T00:54:06.655Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEw6JRN...",
  "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
  "UnsubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic:d6a4f408-4021-4e66-82e3-920cb71bb5fe"
}

最後に

この記事が誰かのお役にたてば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。