SESを利用する際、バウンス対策は必須です。今回はバウンスが発生した際に、「どこに送ろうとしてバウンスになったのか?」を通知できないかと思い、調査しました。
アーキテクチャ バウンス契機でSNSに通知しLambda関数をトリガする
バウンス検知の仕組みはAWSが用意してくれています。SESの設定で、Bounceが起きた際にSNSに通知することができます。
下記のようなアーキテクチャで実現でき、今回は実際にトリガされるLambdaでどのような情報を受け取れるのかを見ていきます。
バウンス発生時、SNS→Lambdaに通知される内容をeventをprintすることで見ていきます。
まずはバウンス通知を設定してみる
SESの設定 バウンス発生時にSNSに通知する設定
SES側の設定はSES→設定→検証済みID→通知から設定できます。
事前にSNSTopicを作成しておいてください。ここではSESBounceTestというTopicを事前に作成していたのでこれを使います。
設定は画面下部フィードバック通知からできます。編集を押してBounceで使用したいSNSTopicを選択します。
今回はBounceですが、Complaint(苦情)、Delivery(配信)時もSNSTopicに通知することが可能です。
Lambdaの設定 SNSTopicトリガでLambda関数を起動するように設定
続いてLambda側の設定です。当該SNSトピックにメッセージが入ったらLambdaが起動するように設定します。
Lambda関数もデフォルトでOKなので事前に作成をお願いします。
筆者は使い慣れているPython3.9でLambda関数を作成しました。今回はログを出すだけなので使い慣れているランタイムでOKです。
Lambda→設定→トリガーからトリガーを追加でSNSTopicを選択します。
Lambda関数でログ出力コード作成
今回は渡されたeventに何が入っているのかを見たいのでeventをprintするだけのコードです。
import json
def lambda_handler(event, context):
print(event)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
デフォルトのコードにprint分を追記しただけです。
動作確認
SESコンソールからテストメールを送信してみる
SESコンソールからテストメールを送ってみましょう。メールを送信してバウンスが起きればlambdaが起動されるはずです。
SES→設定 検証済みID→対象のメールアドレスからテストEメールの送信を押下します。
SESではバウンス用のシミュレーションメールアドレスが用意されているのでそこにメールを送ってみましょう。
Lambda関数の実行ログ確認
するとLambdaがトリガされます。CloudWatchを確認すると以下のようなログが出力されました!(見やすくするために改行しています。)送信元アドレス、送信先アドレスをはじめとしていろいろな情報がありますね。
{'Records': [
{'EventSource': 'aws:sns', 'EventVersion': '1.0', 'EventSubscriptionArn': 'arn:aws:sns:us-east-1: 123456789012:SESBounceTest:c95fd482-2874-403e-91ac-24c1996cb917',
'Sns': {'Type': 'Notification', 'MessageId': '17209c42-105e-5a57-b22b-c04c89467e97',
'TopicArn': 'arn:aws:sns:us-east-1: 123456789012:SESBounceTest', 'Subject': None, 'Message': '{
"notificationType": "Bounce",
"bounce": {
"feedbackId": "01000184fc6d3eb7-0bdde073-a787-4c59-b8c5-ad627d91a5f0-000000",
"bounceType": "Permanent",
"bounceSubType": "General",
"bouncedRecipients": [{
"emailAddress": "bounce@simulator.amazonses.com",
"action": "failed",
"status": "5.1.1",
"diagnosticCode": "smtp; 550 5.1.1 user unknown"
}],
"timestamp": "2022-12-10T14:25:28.000Z",
"remoteMtaIp": "107.20.80.195",
"reportingMTA": "dns; a48-97.smtp-out.amazonses.com"
},
"mail": {
"timestamp": "2022-12-10T14:25:28.294Z",
"source": "test@gmail.com",
"sourceArn": "arn:aws:ses:us-east-1:123456789012:identity/test@gmail.com",
"sourceIp": "124.212.15.103",
"callerIdentity": "root",
"sendingAccountId": "123456789012",
"messageId": "01000184fc6d3ce6-a1da1e67-1e61-4c61-a520-1c6210857e75-000000",
"destination": [
"bounce@simulator.amazonses.com"
]
}
}', 'Timestamp': '2022-12-10T14: 25: 28.929Z',
'SignatureVersion': '1',
'Signature': 'N5FpkFP5WDKf2mekJhguzcvE9YOAUgDryw76Vxxxxxxxxxxxxxxxxxxxxxxx',
'SigningCertUrl': 'https: //sns.us-east-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxx.pem',
'UnsubscribeUrl': 'https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:123456789012:SESBounceTest:c95fd482-2874-403e-91ac-24c1996cb917',
'MessageAttributes': {}
}
}
]}
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ
システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当