Amazon Simple Email Service (SES)の送信件数をCloudWatchのカスタムメトリクスで監視する

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
      ___|___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/
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 | -q

  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"というメールが飛んできました。