メール送信LambdaをAmplifyで作成
Amplify で構築した環境で、DynamoDB の特定のテーブルにレコードが追加された際、Amazon SES を利用してメールを送信するLambda Trigger を作成しました。
Lambda Triggerを作成する
amplify add function
を使ってLambda Trigger を作成します。Cloudformation のテンプレートで、対象のテーブルへの権限は自動生成されます。
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:DescribeStream",
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:ListStreams"
],
"Resource": {
"Fn::ImportValue": {
"Fn::Sub": "${×××GraphQLAPIIdOutput}:GetAtt:(テーブル名)Table:StreamArn"
}
}
}
]
}
Amazon SES を使うためにポリシーを設定します。
cloudformation-template.json のlambdaexecutionpolicy/Properties/PolicyDocument/statement に以下を追加します。
{
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "*"
},
ポリシー設定は完了です。Amazon SES のパッケージをインストールします。
"@aws-sdk/client-ses": "^××"
コード実装
実際のLambda のindex.js のサンプルは以下です。
const {
SESClient, SendEmailCommand
} = require("@aws-sdk/client-ses");
const ses = new SESClient({ region: "ap-northeast-1" });
/**
* @type {import('@types/aws-lambda').APIGatewayProxyHandler}
*/
exports.handler = async (event) => {
const command = new SendEmailCommand({
Destination: {
ToAddresses: ["送信先のメールアドレス"],
},
Message: {
Body: {
Text: { Data: "Test" },
},
Subject: { Data: "Test Email" },
},
// SESのID登録されている検証済みのドメイン・メールアドレス
Source: "送信元のメールアドレス"
});
try {
let response = await ses.send(command);
// process data.
return response;
}
catch (error) {
// error handling.
}
finally {
// finally.
}
};
テスト実施
テストには以下のようなイベントJSON を渡してみてください。
{
"Records": [
{
"eventID": "1",
"eventName": "INSERT",
"eventSource": "aws:dynamodb",
"awsRegion": "ap-northeast-1",
"dynamodb": {
"ApproximateCreationDateTime": 1631635465,
"Keys": {
// テーブルのフィールドに準拠
"××": {
"S": "××"
}
},
"NewImage": {
// テーブルのフィールドに準拠
"××": {
"S": "××"
}
},
"OldImage": {},
"SequenceNumber": "12345678901234567890123456789012345678901234567890",
"SizeBytes": 123,
"StreamViewType": "NEW_IMAGE"
},
"eventSourceARN": "テーブルのARN"
}
]
}
これでテスト実行すると、送信先メールアドレスに設定したアドレスにメールが届きます。