Python で Amazon Simple Notification Service を使う

More than 3 years have passed since last update.


あらすじ

何かを常にチェックして、ある条件が発生したらメールを送る、というのをやりたいというのはよくあること。しかし AWS の EC2 インスタンスからメールを直接送る方法はデフォルトで制限がかかっていて、解除に手続きごとが必要だったりする。

解除したい場合はこちらから

EC2 メール送信制限解除フォーム

予め指定された通知先にメールを送るだけなら Amazon Simple Notification Service が圧倒的に簡単。


Amazon SNS の画面から ARN 発行


  1. AWS のマネジメントコンソールのサービス一覧から Amazon SNS へ移動

  2. 左側のナビゲーションバーから Create and Add プルダウンメニューを見つけてクリック

  3. Create new topic をクリック

  4. ポップアップして来た画面で Topic Name を入れる。Topic Name は実際に ARN の一部になるものなので256文字以内で入力(記号はハイフンとアンダーバーのみ可)。Display Name は SMS 用なので特に入れなくても先に進める

  5. Crate Topic をクリックして作成

  6. 出来上がった後、画面に Topic ARN という表示があるのでその右側の "arn:aws:sns:ap-northeast-1:111111111111:testtopicname" みたいな値を確認する。ap-northeast-1 は作成したリージョンが 111111111111 という12桁の数字は各自の AWS アカウント ID が入るはず。これ重要なのでどこかにメモっとく

  7. 同じ画面下部にある Create Subscription ボタンをクリック

  8. Protocol のところは Email をプルダウンメニューから選択、Endpoint は受け取りたいメールアドレスを入力して、右下の Subscribe ボタンをクリック

  9. close ボタンをクリックして元の情報に戻る。画面上では Subscription ID という項目が Pending Confirmation となっているはず

  10. 登録したメールアドレスには最初に受け取り確認のメールが来る。該当メール内の Confirmation リンクを必ずクリックして受け取り意思表示をしておく。これをやらないと以降の通知メールが届かないので注意

  11. 上の手順をちゃんとやると先ほどまで Pending Confirmation だったところに Subscription ID "arn:aws:sns:ap-northeast-1:111111111111:testtopicname:8851ea7b-0610-4def-9b38-exxxxxxxxxxxxx" がちゃんと入っているはず。でもこれを使うような場面は特になかった気がする。使うのは 6 の手順の Topic ARN だけ


コードを書く

書くというほどたいしたことはしていない。

サンプルコードをコピって内容を書き換えて、元のコードの後ろに継ぎ足しただけ。


snstest.py

import boto.sns

region = 'ap-northeast-1'
#このリージョンはどこのリージョンを使うかの指定なので、実際に ARN 取得したリージョンを入れる

if conditionmatched:
#とある条件にマッチしたら

topic = 'arn:aws:sns:ap-northeast-1:111111111111:testtopicname'
#さっきの Topic ARN を使って

subject = 'Your Email Subject!!'
#こんなメールのタイトルで

body = 'You got %s !' % (messagebody)
#こんなメールのボディの内容を送る。英語なのは文字コードとか面倒だったからだけど、多分そんなに面倒ではないはず...

conn = boto.sns.connect_to_region(region)
conn.publish(topic, body, subject)



終わりに

Amazon Simple Notification Service は今でこそ Mobile Push が対応で脚光を浴びている感じがするけど、これまであまり表には出て来てなかった縁の下の力持ち的存在。特に CloudWatch のアラーム設定の後ろで静かに働いているけなげな姿に心打たれる...しかし、たった数行をもともと書いたコードの後ろになんとなくくっつけてあげただけで、ちゃんと動いてくれる可愛いやつなので使わない手はない。

本当は API コール失敗したら Exponential back off でリトライとかまで考えないといけないのかもしれないけど、今回監視しているのはそこまでクリティカルなものじゃないのでこれで良い。


参考文献

API コールのよくあるエラーについてはこちらを参考に

Amazon Simple Notification Service API Guide - Common Errors (英語のみ)

API コールが失敗した際のリトライ方法についてはこちらを参考に

Amazon Web Service General Reference (日本語翻訳版)