読者です 読者をやめる 読者になる 読者になる

続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

Amazon SNS のHTTP(S)通知を試す

最近Amazon SNSのアイコンはMobile Services に吸収されたばかりですが、モバイルのプッシュ通知だけでなく、AWS内部で発生したイベントを外部に通知するという目的でもSNSはとても役に立ちます。

すぐに思い浮かぶのは、障害発生時や、SESやDataPipelineと言ったサービスで、異常検知した瞬間に通知メールを投げるなどといった用途です。SNSは通知先として、E-Mail, SQS, HTTP/HTTPS, モバイルプッシュ が使えますが、あまり使わないであろう HTTP/HTTPSをあえて試してみます。

まず、E-MailやHTTPの通知を使う場合、サブスクリプションを行う必要があります。具体的にはトピックというものを作製し、それをサブスクリプション(購読)するユーザーに、確認をもらう必要があります。Mailの場合は、確認メールにリンクが付いているので、それをクリックするだけですが、HTTP通知の場合は少々面倒です。

HTTP通知の中身ですが、イベント発生時にSNSから、HTTP(S) POSTが飛びます。中身はJSONで、これを自前のWebサーバー側でパースし、処理を行います。つまり、受け側は(自作する方)はWebサーバーであれば何でも構いません。EC2以外でも問題ありません。次に、Webサーバーであればなんでもいいのですが、JSONをパースするためのアプリケーションが必要です。言語は何でも構いません、POSTされてくるJSONが読めれば良いということです。

早速手順ですが、SNSのメール通知とほぼ同じなので、トピック作製までは飛ばします。サブスクリプション作製時に、HTTPを選択し、実際に受信するURLを指定します。このURLでSNSからのJSONを受けます。ということは、ここで通知を受け取るWebアプリを準備しておく必要があります。とりあえず、受けてLogに書き込むだけのphpを、拝借して、試してみます。

<?php

$json = file_get_contents("php://input");

error_log ($json, 3, '/var/log/webapp/error.log');

?>

サブスクリプションすると、早速ログにJSONが出ているので、登録用URLを見つけ、ブラウザでアクセスします。(本当は、JSONをパースして、受信したサーバーが、登録用URLへGETする事になります。)この後は普通にSNSが通知を発行出来ます。Webサーバーが落ちていた時の再送はやってくれるのか?については、DeliveryPolicyで指定できます。

スクリーンショット 2014-08-15 20.38.22.png

HTTP通知の用途ですが、障害やバウンスメールの捌きとしてはあまり筋がよくありません。というのも、処理を実行するのは1台のマシンであれば良いので、SQSでキューイングしたほうが何かと都合が良いからです。では、逆に複数のマシンが同時に処理してもよい、もしくはさせたいものや、素直にブログPing的なPub/Sub用途には非常に使いやすいと思います。

参考

http://blog.suz-lab.com/2012/10/amazon-ses-mailbox-simulator-sns-sns.html

http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.html