AWS SESのバウンス・苦情メールをSNS経由で通知する(2017/12版)
概要
AWS SESのバウンス・苦情を管理したい。
これらを放置して一定の基準を超えてしまうとSESが停止されてしまうためである。詳細は以下のリンクを参照。
SESにはバウンス・苦情があった場合の通知機能があり、SNSを経由して他のサービスなどに通知ができるのでこれを試してみる。
構成は以下のとおり。まずはEメールで通知が受け取れることを確認してからLambdaで確認する。
SES
region
SESは日本リージョンがサポートされていない。(2017/12/16現在)なので他のリージョンを利用する。オレゴンに変更する。
送信制限
何もしていない初期状態のSESではSandboxモードになっており、任意のメールアドレスに好き勝手メール送信することができない。
本番運用するときは「sending limit increase」のリクエストをする必要がある。
Sandbox状態でも認証済みのメールアドレス、AWSが提供しているシミュレーション用のメールアドレスにはメールを送ることができるので今回はリクエストはせず、それらを利用する。
メールの認証をする
「Veryfy a New Email Address」をクリックする。
認証したいアドレスを入力(とりあえず自分のgmailアドレスを入力した)
「Veryfy This Email Address」をクリックすると、認証確認メールを送った みたいな表示に変わる。
認証メールに記載されたリンクをクリックする。
無事認証されたようだ。
メール送信確認
認証されたメールでメール送信できるか確認する。
先程追加したメールを選択して「Send a Test Mail」をクリックする。
メールダイアログが表示されるので入力して「Send Test Mail」をクリックする。
ちゃんとメールが送信されたようだ。
SNSの設定
新規Topicを追加
SNSのコンソールから新しいTopicを作成する。
SESとSNSを関連付けさせる
SESのコンソールへ戻り、先程追加したEメールアドレスの詳細画面から「Notification」の項目を開く。
「Edit Configuration」ボタンをクリック。
「Bounce」と「Complaints」に先程作成したSNS Topicを指定して「Save Config」をクリックする。
※注意点:SNSのTopicはSESと同じRegionで作成すること。SESと違うRegionで作成するとSES設定時に以下のようなエラーが発生する。
SNS topic arn:aws:sns:ap-northeast-1:0250XXXXXXXX:ses-test-jp is invalid. (Service: AmazonSimpleEmailService; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 4903ea77-e200-11e7-b63a-XXXXXXXXXXXX)
サブスクリプションの追加
Bounce、Complaints通知が届くことを確認するために、まずはメールで通知されるように設定する。
先程作ったSNS Topicに対してEメールのサブスクリプションを追加する。
SNSのEメールサブスクリプションもSNS同様に認証済みのEメールアドレスにしか送信することができないらしい。
上記で入力したEメールアドレスに認証メールが通知されているはずなので、SESと同じ要領でメールアドレスを認証済みにする。
Bounceメールを送ってみる
BounceやComplaintsになるメールアドレスはAWSがテスト用として提供しているのでこれを利用する。
docs.aws.amazon.com
先程と同様にToをBounce用のメールアドレスに設定してテストメールを送る。
SES→SNS→メール経由でBounce通知が送られてきた。
SNSの通知をLambdaで処理する
先程はSNSの通知先をEメールにしたが、次はLambdaに通知してみる。
新しいLambdaを作成する
LambdaはSNSとは別リージョンで作成しても問題ない。なので日本リージョンで作成した。
プリセットからSNS受信用Lambdaを選択する。
名前などを入力する。別リージョンで作るとSNSトピックがプルダウンでは出てこないようなのでARNを直接入力する。
Lambdaのコード
SNSから通知受け取れることを確認するだけなので、デフォルトのコードから一切変更していない。
'use strict'; console.log('Loading function'); exports.handler = (event, context, callback) => { //console.log('Received event:', JSON.stringify(event, null, 2)); const message = event.Records[0].Sns.Message; console.log('From SNS:', message); callback(null, message); };
先程と同じ要領でSESからテストメールを送る。
その後LambdaのCloudWatchログを表示してSNSの通知が来ていることを確認する。