Amazon SNSのNotificationを待ち受けるPython
やりたいことから離れてしまったのだけど、とりあえず前回の続きとして。
Glacierのジョブの完了をPythonからじっと待つ
のだが、よく考えると簡単なHTTPサーバならPythonで立ち上げりゃいいじゃん。
Glacierとつないでどうのというところはめんどいので後回しにして、とりあえずAmazon SNSとローカルのPythonが楽しくお話出来るところまでやった。
https://github.com/dmiyakawa/glacier_exp_py/blob/ec8e8580a9484f49e232261e041e8a19824b1d43/wait_sns_via_http.py
Pythonの流儀的に怪しいところがある可能性大。というのもHTTPServer的なのめったに書いたことないし、しかもPOSTの正確な仕様知らん。
○ API的な話
基本的にはこれを読めば書けるようになる:
Appendix D: Sending Amazon SNS Messages to HTTP/HTTPS Endpoints
肝はSubscriptionConfirmationのところ。全く別件でこの部分がネックになった (とあるアプリサーバのその部分を書き換えられない) ので書き始めたのだった。
○ テスト
上記のサーバアプリを起動し、Amazon SNSでSubscriptionを作ってメッセージをpublishするだけ。目標をセンターに入れてスイッチ。
もちろん外部から見えるサーバじゃないとだめ (192.168.x.x だったらポートフォワーディングとかやって)
○ 参考にしたサイト
すみませんねPython初級なもんで
現状だとセキュリティ的には結構まずい。ARN丸見えだから簡単に別のサーバがNotificationを送ってこれてしまう。また、ConfirmationでポチってるURLを詐称されると何かさらにまずい。
対処策の一つはhttpsを使うこと。ただし証明書周りを自分で実装することになり……え、まじでそれやるのか? しかもオレオレ証明書はダメらしい。 (http://docs.amazonwebservices.com/sns/latest/gsg/SendMessageToHttp.https.ca.html)
Glacierのジョブの完了をPythonからじっと待つ
もちろんメールサーバを持っておく、HTTPサーバでフックするなどあるものの、詳細考えると今回のケースだけに準備するのはややオーバーキルだし、げんなりする。メンテしてらんない。当初Apache起動してどうのというのが頭に浮かんで、さすがにそれはないわー、とか思ってた。
のだが、よく考えると簡単なHTTPサーバならPythonで立ち上げりゃいいじゃん。
Glacierとつないでどうのというところはめんどいので後回しにして、とりあえずAmazon SNSとローカルのPythonが楽しくお話出来るところまでやった。
https://github.com/dmiyakawa/glacier_exp_py/blob/ec8e8580a9484f49e232261e041e8a19824b1d43/wait_sns_via_http.py
Pythonの流儀的に怪しいところがある可能性大。というのもHTTPServer的なのめったに書いたことないし、しかもPOSTの正確な仕様知らん。
○ API的な話
基本的にはこれを読めば書けるようになる:
Appendix D: Sending Amazon SNS Messages to HTTP/HTTPS Endpoints
肝はSubscriptionConfirmationのところ。全く別件でこの部分がネックになった (とあるアプリサーバのその部分を書き換えられない) ので書き始めたのだった。
○ テスト
上記のサーバアプリを起動し、Amazon SNSでSubscriptionを作ってメッセージをpublishするだけ。目標をセンターに入れてスイッチ。
もちろん外部から見えるサーバじゃないとだめ (192.168.x.x だったらポートフォワーディングとかやって)
○ 参考にしたサイト
すみませんねPython初級なもんで
- http://georgik.sinusgear.com/2011/01/07/how-to-dump-post-request-with-python/
- http://fragments.turtlemeat.com/pythonwebserver.php
- http://www.python.jp/doc/2.6/library/json.html
- http://www.python.jp/doc/release/library/xml.etree.elementtree.html
○ 他
現状だとセキュリティ的には結構まずい。ARN丸見えだから簡単に別のサーバがNotificationを送ってこれてしまう。また、ConfirmationでポチってるURLを詐称されると何かさらにまずい。
対処策の一つはhttpsを使うこと。ただし証明書周りを自分で実装することになり……え、まじでそれやるのか? しかもオレオレ証明書はダメらしい。 (http://docs.amazonwebservices.com/sns/latest/gsg/SendMessageToHttp.https.ca.html)