■ Amazon SES
Amazon SESは安価に大量のメールを送信するのに便利なサービス(詳しくは⇒http://aws.amazon.com/jp/ses/pricing/)ですが、
– Daily sending quota: 1日に送信できるメールの件数
– Maximum send rate: 1秒間に送信できるメールの件数
といった制限がございます。
■ メール送信状況の監視
メールの送信状況は ses-get-stats.pl というスクリプトを使って取得出来るので、
コレをCloudWatchのカスタムメトリクスを使って監視してみたいと思います。
ses-get-stats.plの詳しい説明は↓こちらです。
http://docs.aws.amazon.com/ses/latest/DeveloperGuide/scripts-sending-limits.html
■ EC2インスタンスでメール送信状況を取得
Amazon Linuxを利用すると、ses-get-stats.pl は配置されていてパスが通っていますので直ぐ叩けます。
$ ssh -i xxx.pem ec2-user@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com __| __|_ ) _| ( / Amazon Linux AMI ___|___|___|6 package(s) needed for security, out of 18 available Run "sudo yum update" to apply all updates. [ec2-user@ip-xxx-xxx-xxx-xxx ~]$ [ec2-user@ip-xxx-xxx-xxx-xxx ~]$ ses-get-stats.pl Usage: ses-get-stats.pl [--help] [-e URL] [-k FILE] [--verbose] -s | -qAWS | Amazon Linux AMI
APIアクセス用のクレデンシャルなファイルをaws-credentialsという名前で作っておいて、
それを -k に渡して叩くと値が取得出来ます。
$ cat aws-credentials AWSAccessKeyId=Axxxxxxxx AWSSecretKey=uxxxxxxxxxxxx $ ses-get-stats.pl -k aws-credentials -q SentLast24Hours Max24HourSend MaxSendRate 3 200 1
SentLast24Hours を Max24HourSend で割って70%超えたら〜みたいな感じにしようかな、と。
まずは連続する複数のスペースをカンマにして扱いやすくします。
$ cat stats.txt | sed -e 's/s+/,/g' SentLast24Hours,Max24HourSend,MaxSendRate, 3,200,1,
次にawsで2行目の1項目を2項目で割って100かけた値を出力してみます。
$ ses-get-stats.pl -k aws-credentials -q | sed -e 's/s+/,/g' | awk -F, '{if(NR==2) print $1/$2*100}' 1.5
こちらをcronで5分置きに起動してCloudWatchのカスタムメトリクスに連携して監視すれば良さそうです。
尚、SESはデフォルトではサンドボックスだけ使用可能でサンドボックスユーザーが送信できるのは、
1日200通&1秒間に1通のメールに制限されています。
■ mon-put-dataコマンドを使ってCloudWatchに連携
CloudWatchのカスタムメトリクスに値を連携するにはmon-put-dataコマンドを使用しますが、
まずは手動で叩いてみます。
$ /opt/aws/bin/mon-put-data --metric-name "SES Limit Ratio" --namespace "Custom Metrix" --value "1.5" --unit "Percent" --aws-credential-file aws-credentials
そうすると、CloudWatchのMetricsのところにCustom Metricsのプルダウンが出てきて、
グラフが見れるようになります。
では、さっそくアラート用のNotificationを作ってみましょう。
今回は便宜上なので5%を超えたらアラートがくるようにします。
■ スクリプトをcronに設定
上記のスクリプトをシェルにしてcronに組み込みます。
# cronからの実行なので何かとフルパスにしたり環境変数を追加したり。
$ cat ses_watch.bash #!/bin/bash export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon export JAVA_HOME=/usr/lib/jvm/jre percent=`/opt/aws/bin/ses-get-stats.pl -k /home/ec2-user/aws-credentials -q | sed -e 's/s+/,/g' | awk -F, '{if(NR==2) print $1/$2*100}'` /opt/aws/bin/mon-put-data --metric-name "SES Limit Ratio" --namespace "Custom Metrix" --value "$percent" --unit "Percent" --aws-credential-file /home/ec2-user/aws-credentials --region ap-northeast-1 exit 0
でもって上記のシェルをcrontabに登録します。
#/dev/nullに捨てるとか捨てないとか議論があるようですが、、、
$ crontab -l */5 * * * * /bin/bash /home/ec2-user/ses_watch.bash >> /home/ec2-user/ses_watch.log
■ SESのConsoleからメールを送信してアラートを受け取る
断続的に何通か送ってみます。
5パーセント超えました
アラーム飛びました。
SNSの設定で自分のメールに飛ばすようにしていたので”ALARM: “SES Limit Alert” in APAC – Tokyo”というメールが飛んできました。
日経BP社
売り上げランキング: 75
コメント