Lambda を使用して、Amazon SES E メールの Amazon SNS 通知を DynamoDB に保存するにはどうすればよいですか?
Amazon Simple Notification Service (Amazon SNS) を使用して、Amazon Simple Email Service (Amazon SES) から送信された E メールに関する通知を受け取っています。これらの通知を Amazon DynamoDB テーブルに保存するために AWS Lambda 関数を設定したいと考えています。
解決策
注: 次のステップのコード例は、Node.js バージョン 16.x 以前の Lambda ランタイムでのみ機能します。
(前提条件) Amazon SES からの通知を受信するように設定された Amazon SNS トピックを使用して Amazon SES E メールまたはドメインをセットアップする
詳細については、「Amazon SNS を使用した Amazon SES 通知の受信」を参照してください。
DynamoDB テーブルを作成する
1. 次の属性を持つテーブルをDynamoDB に作成します。
[テーブル名] には、「SESNotifications」と入力します。
[プライマリパーティションキー] には、「SESMessageId」と入力します。
[プライマリソートキー] には、「SnsPublishTime」と入力します。
2. Lambda がテーブルをクエリして Amazon SES レポートを作成できるようにするには、次のセカンダリインデックスを設定します。
インデックス名 | パーティションキー | ソートキー |
---|---|---|
SESMessageType-Index | SESMessageType (文字列) | SnsPublishTime (文字列) |
SESMessageComplaintType-Index | SESComplaintFeedbackType (文字列) | SnsPublishTime (文字列) |
注: 必要に応じて、セカンダリインデックスを追加できます。
DynamoDB でテーブルを作成する方法については、「DynamoDB テーブルを作成する」を参照してください。
Lambda 関数の IAM ロールに DynamoDB テーブルを呼び出す権限を追加します。
新しい AWS Identity and Access Management (IAM) ロールを作成します。Lambda 関数が DynamoDB:PutItem API を呼び出すことができるようにロールを設定します。
注: さまざまな Lambda 関数用に新しい IAM ロールを作成して使用するのがベストプラクティスです。ロールを複数の機能にわたって使いまわすことは避けてください。
1. IAM コンソールのナビゲーションペインで、[ロール]] を選択します。
2. [ロールを作成] を選択します。
3. [信頼されたエンティティの種類を選択] で、[AWS サービス] を選択します。
4. [ユースケースの選択] で、[Lambda] を選択します。次に、[次へ: アクセス許可] を選択します。
5. [許可ポリシーをアタッチ] では、[AWSLambdaBasicExecutionRole] 管理ポリシーの横にあるチェックボックスを選択します。次に、[次へ: タグ] を選択します。
6. (オプション) ユースケースのロールに IAM タグを追加します。詳細については、「IAM リソースのタグ付け」を参照してください。
7. [次へ: レビュー] を選択します。
8. [ロール名]* には「lambda_ses_execution」と入力します。
9. [ロールを作成] を選択します。
10. [IAM ロール] ビューに戻り、作成したロールを選択します。
11. [アクセス許可] タブで、[インラインポリシーの追加] を選択します。
12. [ビジュアルエディタ] タブで、[サービスの選択] を選択します。
13. [DynamoDB] を選択します。
14. [アクション] 検索フィールドに「PutItem」と入力します。表示されるドロップダウンリストで、[PutItem] の横にあるチェックボックスを選択します。
15. [リソース] で [特定] を選択します。
16. [ARN の追加] を選択します。次に、表示されるテキストボックスに、DynamoDB テーブルの Amazon リソースネーム (ARN) を入力します。
17. [ポリシーの確認] を選択します。
18. [名前] にポリシーの名前を入力します。
19. [ポリシーを作成] を選択します。
DynamoDB テーブルへのアクセスを許可するインライン IAM ポリシーの例
{ "Version": "2012-10-17", "Statement": \[ { "Sid": "Stmt1428510662000", "Effect": "Allow", "Action": \[ "DynamoDB:PutItem" \], "Resource": \[ "arn:aws:DynamoDB:us-east-1:12345678912:table/SESNotifications" \] } \] }
Amazon SES と Amazon SNS の通知を処理する Lambda 関数を作成する
次のサンプル関数コードを使用して、sesnotificationscode という名前の Lambda 関数を作成します。次の Lambda 関数の例は、顧客関係管理 (CRM) システムやその他の宛先にデータを書き込むためのテンプレートとして使用できます。
重要: 必ず lambda_ses_executionロールを関数に割り当ててください。
Amazon SNS 通知をチェックし、関連する Amazon SES 通知を DynamoDB テーブルに格納する Lambda 関数コードの例
console.log("Loading event"); var aws = require("aws-sdk"); var ddb = new aws.DynamoDB({ params: { TableName: "SESNotifications" } }); exports.handler = function (event, context, callback) { console.log("Received event:", JSON.stringify(event, null, 2)); var SnsPublishTime = event.Records\[0\].Sns.Timestamp; var SnsTopicArn = event.Records\[0\].Sns.TopicArn; var SESMessage = event.Records\[0\].Sns.Message; SESMessage = JSON.parse(SESMessage); var SESMessageType = SESMessage.notificationType; var SESMessageId = SESMessage.mail.messageId; var SESDestinationAddress = SESMessage.mail.destination.toString(); var LambdaReceiveTime = new Date().toString(); if (SESMessageType == "Bounce") { var SESreportingMTA = SESMessage.bounce.reportingMTA; var SESbounceSummary = JSON.stringify(SESMessage.bounce.bouncedRecipients); var itemParams = { Item: { SESMessageId: { S: SESMessageId }, SnsPublishTime: { S: SnsPublishTime }, SESreportingMTA: { S: SESreportingMTA }, SESDestinationAddress: { S: SESDestinationAddress }, SESbounceSummary: { S: SESbounceSummary }, SESMessageType: { S: SESMessageType }, }, }; ddb.putItem(itemParams, function (err, data) { if (err) { callback(err) } else { console.log(data); callback(null,'') } }); } else if (SESMessageType == "Delivery") { var SESsmtpResponse1 = SESMessage.delivery.smtpResponse; var SESreportingMTA1 = SESMessage.delivery.reportingMTA; var itemParamsdel = { Item: { SESMessageId: { S: SESMessageId }, SnsPublishTime: { S: SnsPublishTime }, SESsmtpResponse: { S: SESsmtpResponse1 }, SESreportingMTA: { S: SESreportingMTA1 }, SESDestinationAddress: { S: SESDestinationAddress }, SESMessageType: { S: SESMessageType }, }, }; ddb.putItem(itemParamsdel, function (err, data) { if (err) { callback(err) } else { console.log(data); callback(null,'') } }); } else if (SESMessageType == "Complaint") { var SESComplaintFeedbackType = SESMessage.complaint.complaintFeedbackType; var SESFeedbackId = SESMessage.complaint.feedbackId; var itemParamscomp = { Item: { SESMessageId: { S: SESMessageId }, SnsPublishTime: { S: SnsPublishTime }, SESComplaintFeedbackType: { S: SESComplaintFeedbackType }, SESFeedbackId: { S: SESFeedbackId }, SESDestinationAddress: { S: SESDestinationAddress }, SESMessageType: { S: SESMessageType }, }, }; ddb.putItem(itemParamscomp, function (err, data) { if (err) { callback(err) } else { console.log(data); callback(null,'') } }); } };
注: TableName パラメーター SESNotifications を DynamoDB テーブルの名前に置き換えてください。
Lambda 関数を 1 つ以上の Amazon SNS トピックにサブスクライブする
Amazon SNS コンソールを使用する
SNS が関数を呼び出せるようにするには、関数リソースポリシーに手動で権限を追加する必要があります。これらの権限を追加するには、次の AWS CLI コマンドを実行します。
注: AWS CLI コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \\ \--principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-1:123456789012:my-topic
注: my-function、sns-my-topic、および arn:aws:sns:us-east-1:123456789012:my-topic の値を、必ず関数の ID、トピック、および完全な ARN に置き換えてください。
必要な権限を追加したら、次の手順を実行して SNS トピックに関数をサブスクライブします。
1. Amazon SNS コンソールのナビゲーションペインで、[トピック] を選択します。
2. バウンス通知のために Amazon SES で使用される SNS トピックを特定します。例: ses_notifications_repo という名前の SNS トピック。
3. SNS トピックの ARN を選択します。[トピックの詳細] ページが開きます。
4. [サブスクリプションの作成] を選択します。
5. [プロトコル]] には、[AWS Lambda] を選択します。
6. [エンドポイント] には、Lambda 関数の ARN を入力します。
7. [サブスクリプションの作成] を選択します。
8. (オプション) 関数にサブスクライブする通知トピックを追加するたびに、手順 1 ~ 7 を繰り返します。
Lambda コンソールを使用する
1. Lambda コンソールで関数のページを開きます。
2. 作成した Lambda 関数を選択します。
3. [関数の概要] ペインで、[+トリガーの追加] を選択します。
4. [トリガーの設定] ドロップダウンリストで、[SNS] を選択します。設定パネルが表示されます。
5. [SNS トピック] ドロップダウンリストで、関数をサブスクライブする SNS トピックを選択します。
6. [追加] を選択します。
7. (オプション) 関数にサブスクライブする通知トピックを追加するたびに、手順 1 ~ 6 を繰り返します。
セットアップのテスト: Amazon SES メッセージを送信して Lambda 関数を呼び出す
Amazon SES のテストメッセージを送信するには、使用可能なメールボックスシミュレーターアドレスのいずれかを使用します。
注: テストメッセージを送信するときに、メールボックスシミュレーターアドレスのいずれかを使用すると、SES の配信性能メトリクスへの悪影響を防ぐことができます。
テストメッセージを送信すると、Amazon SES は SNS トピックに通知を発行します。次に、Amazon SNS は、通知を SNS イベントオブジェクト内の JSON エスケープされた SES イベント通知オブジェクトとして Lambda に配信します。
Lambda コンソールを使用してローカルテスト用のサンプルイベントを作成するには、「Amazon SES が Amazon SNS に発行するイベントデータの例」を参照してください。
重要: これらのイベントデータの例は、Lambda コンソールでテストメッセージを送信する目的で作成されているため、使用することはできません。サンプルを Lambda コンソールでテストするには、eventType メッセージキーを notificationType に変更する必要があります。メッセージキーを変更しないと、テストは失敗します。
DynamoDB からレポートをダウンロードして、Amazon SES 通知を表示する
DynamoDB テーブルの内容を.csv ファイルとしてクエリ、ソート、ダウンロードするには、次の手順を実行します。
1. DynamoDB コンソールを開き、[SESNotifications] テーブルを通知します。
2. [項目] タブを選択します。
3. [クエリ] または [スキャン] 検索を作成します。詳細については、「データのクエリとスキャンのベストプラクティス」を参照してください。
**注:**DynamoDB テーブルエクスポートを使用すれば、Amazon シンプルストレージサービス (Amazon S3) バケットへのファイルのダウンロードを定期的にスケジュールすることができます。詳細については、「Amazon S3 への DynamoDB データエクスポート:仕組み」を参照してください。
関連情報
関連するコンテンツ
- 質問済み 4ヶ月前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 2ヶ月前lg...
- AWS公式更新しました 3ヶ月前
- AWS公式更新しました 1年前
- AWS公式更新しました 8ヶ月前