AWS SESのバウンス・苦情メールをSNS経由で通知する(2017/12版)

概要

AWS SESのバウンス・苦情を管理したい。
これらを放置して一定の基準を超えてしまうとSESが停止されてしまうためである。詳細は以下のリンクを参照。

docs.aws.amazon.com

SESにはバウンス・苦情があった場合の通知機能があり、SNSを経由して他のサービスなどに通知ができるのでこれを試してみる。
構成は以下のとおり。まずはEメールで通知が受け取れることを確認してからLambdaで確認する。

f:id:hkou:20171216113334p:plain

SES

region

SESは日本リージョンがサポートされていない。(2017/12/16現在)なので他のリージョンを利用する。オレゴンに変更する。

f:id:hkou:20171216065233p:plain

送信制限

何もしていない初期状態のSESではSandboxモードになっており、任意のメールアドレスに好き勝手メール送信することができない。
本番運用するときは「sending limit increase」のリクエストをする必要がある。
Sandbox状態でも認証済みのメールアドレス、AWSが提供しているシミュレーション用のメールアドレスにはメールを送ることができるので今回はリクエストはせず、それらを利用する。

f:id:hkou:20171216065937p:plain

メールの認証をする

「Veryfy a New Email Address」をクリックする。 f:id:hkou:20171216094415p:plain

認証したいアドレスを入力(とりあえず自分のgmailアドレスを入力した) f:id:hkou:20171216094451p:plain

「Veryfy This Email Address」をクリックすると、認証確認メールを送った みたいな表示に変わる。 f:id:hkou:20171216094525p:plain

認証メールに記載されたリンクをクリックする。 f:id:hkou:20171216094700p:plain

無事認証されたようだ。 f:id:hkou:20171216094724p:plain

メール送信確認

認証されたメールでメール送信できるか確認する。
先程追加したメールを選択して「Send a Test Mail」をクリックする。
メールダイアログが表示されるので入力して「Send Test Mail」をクリックする。
f:id:hkou:20171216094844p:plain

ちゃんとメールが送信されたようだ。
f:id:hkou:20171216094955p:plain

SNSの設定

新規Topicを追加

SNSのコンソールから新しいTopicを作成する。
f:id:hkou:20171216102229p:plain

SESとSNSを関連付けさせる

SESのコンソールへ戻り、先程追加したEメールアドレスの詳細画面から「Notification」の項目を開く。
「Edit Configuration」ボタンをクリック。
f:id:hkou:20171216102445p:plain

Bounce」と「Complaints」に先程作成したSNS Topicを指定して「Save Config」をクリックする。
f:id:hkou:20171216102520p:plain

※注意点: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)

f:id:hkou:20171216103058p:plain

サブスクリプションの追加

Bounce、Complaints通知が届くことを確認するために、まずはメールで通知されるように設定する。
先程作ったSNS Topicに対してEメールのサブスクリプションを追加する。

f:id:hkou:20171216104000p:plain

SNSのEメールサブスクリプションSNS同様に認証済みのEメールアドレスにしか送信することができないらしい。
上記で入力したEメールアドレスに認証メールが通知されているはずなので、SESと同じ要領でメールアドレスを認証済みにする。

Bounceメールを送ってみる

BounceやComplaintsになるメールアドレスはAWSがテスト用として提供しているのでこれを利用する。
docs.aws.amazon.com

先程と同様にToをBounce用のメールアドレスに設定してテストメールを送る。
f:id:hkou:20171216104750p:plain

SES→SNS→メール経由でBounce通知が送られてきた。
f:id:hkou:20171216111533p:plain

SNSの通知をLambdaで処理する

先程はSNSの通知先をEメールにしたが、次はLambdaに通知してみる。

新しいLambdaを作成する

LambdaはSNSとは別リージョンで作成しても問題ない。なので日本リージョンで作成した。
プリセットからSNS受信用Lambdaを選択する。
f:id:hkou:20171216111812p:plain

名前などを入力する。別リージョンで作るとSNSトピックがプルダウンでは出てこないようなのでARNを直接入力する。
f:id:hkou:20171216111942p:plain

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の通知が来ていることを確認する。
f:id:hkou:20171216112139p:plain