Amplify×Lambda×SESでメール配信


概要

開発中のアプリにレポートを投稿した際にメール通知が必要ということでAWSのSESを利用した検証を行いました。
メール通知やメール配信を考えている方の少しでも参考になればと思います。

事前に

アプリケーション

Amplify SNS Wrokshopの「FOLLOW/TIMELINE機能の実装」までを実装済みの方を前提としています。
しかし、SESの実装自体は簡単ですので、Amplify SNS Wrokshopをやっていない方でも実装できると思います。

Email認証

SESの送信元は検証済みのEメールアドレスが必要となります。
検証済みのEメールアドレスがない方はこちらを参考に準備してください。

実装

権限設定

LambdaにSESの権限を与えるにはamplify/backend/function/createPostAndTimeline/createPostAndTimeline-cloudformation-template.jsonを編集します。
lambdaexecutionpolicy>PolicyDocument>Statement>Actionにses:SendEmailses:SendRawEmailを追加します。

    "lambdaexecutionpolicy": {
      "DependsOn": [
        "LambdaExecutionRole"
      ],
      "Type": "AWS::IAM::Policy",
      "Properties": {
        "PolicyName": "lambda-execution-policy",
        "Roles": [
          {
            "Ref": "LambdaExecutionRole"
          }
        ],
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ses:SendEmail", // Here!
                "ses:SendRawEmail" // Here!
              ],
              "Resource": {
                "Fn::Sub": [
                  "arn:aws:logs:${region}:${account}:log-group:/aws/lambda/${lambda}:log-stream:*",
                  {
                    "region": {
                      "Ref": "AWS::Region"
                    },
                    "account": {
                      "Ref": "AWS::AccountId"
                    },
                    "lambda": {
                      "Ref": "LambdaFunction"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    },

AWS SDKのインストール

AWS SDKをamplify/backend/function/createPostAndTimeline/srcにインストールします。

cd amplify/backend/function/createPostAndTimeline

npm install aws-sdk

送信処理

ここからamplify/backend/function/createPostAndTimeline/src/index.jsに送信処理を加えていきます。

まずは、AWS SDKを読み込みます。

const AWS = require("aws-sdk")

さらに、フォロー処理の下あたりに処理を加えます。 

1.送信するEmailのparamsを設定
2.リージョンを設定
3.送信処理

exports.handler = async (event, context, callback) => {
・
・
・
const listFollowRelationshipsResultWithOwner = await graphqlClient.query({
        query: gql(listFollowRelationships),
        fetchPolicy: 'network-only',
        variables: queryInput,
});

// 1.送信するEmailのparamsを設定
const params = {
    Destination: {// 必須
     CcAddresses: [
       'EMAIL_ADDRESS',
     ],
     ToAddresses: [
       'EMAIL_ADDRESS',
     ]
    },
    Message: { // 必須
      Body: { // 必須
        Text: {
          Charset: 'UTF-8',
          Data: `投稿内容:${res.data.createPost.content}\n投稿日時:${new Date(res.data.createPost.timestamp)}`,
        },
      },
      Subject: {
        Charset: 'UTF-8',
        Data: '投稿しました'
      },
    },
    Source: 'SENDER_EMAIL_ADDRESS', // From・必須
}

// 2.リージョンを設定
AWS.config.update({ region: "ap-northeast-1" })

// 3.送信処理
const ses = new AWS.SES()
try {
    await ses.sendEmail(params).promise()
    console.log("Success to Send an Email")
    return
} catch (e) {
    console.log(`Failed to Send an Email: ${e}`)
    return
}

  return post;
};

送信結果

アプリを起動して、投稿をするとメールが届きました!

まとめ

今回はSESでメールの送信を実装しましたが、Lambdaに権限を追加すれば他のAWSのサービスも利用できそうです。
SESには、今回使っていない設定やテンプレートなどがあるようなので、カスタマイズしたい方はこちらを参考にしてみてください。

参考

使用した E メールの送信Amazon SES
Lambda と Amazon SES を使用して E メールを送信するにはどうすればよいですか?



- Miyata Koki -
O:inc.でAmplify×React×React Nativeを使用して開発しています。大学のゼミでは統計学をPythonで行っています。
インターンやゼミで学んだ情報を発信していくので、フォロバするのでぜひこちらのアカウントのフォローお願いします!