Amplify×Lambda×SESでメール配信

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

## 事前に

### アプリケーション
[Amplify SNS Wrokshop](https://amplify-sns.workshop.aws/ja/10_getting_started/00_what_you_build.html)の「[FOLLOW/TIMELINE機能の実装](https://amplify-sns.workshop.aws/ja/50_follow_timeline.html)」までを実装済みの方を前提としています。
しかし、SESの実装自体は簡単ですので、Amplify SNS Wrokshopをやっていない方でも実装できると思います。

### Email認証
SESの送信元は検証済みのEメールアドレスが必要となります。
検証済みのEメールアドレスがない方は[こちら](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/verify-email-addresses.html)を参考に準備してください。

## 実装

### 権限設定

LambdaにSESの権限を与えるには```amplify/backend/function/createPostAndTimeline/createPostAndTimeline-cloudformation-template.json```を編集します。
lambdaexecutionpolicy>PolicyDocument>Statement>Actionに```ses:SendEmail```と```ses: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](https://aws.amazon.com/jp/getting-started/tools-sdks/)を読み込みます。

```
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;
};
```

### 送信結果
アプリを起動して、投稿をするとメールが届きました！
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542018/c9c514db-07cc-25a1-63e1-ad262b3f6278.png)

## まとめ
今回はSESでメールの送信を実装しましたが、Lambdaに権限を追加すれば他のAWSのサービスも利用できそうです。
SESには、今回使っていない設定やテンプレートなどがあるようなので、カスタマイズしたい方は[こちら](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/ses-examples-sending-email.html)を参考にしてみてください。

### 参考
[使用した E メールの送信Amazon SES](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/ses-examples-sending-email.html)
[Lambda と Amazon SES を使用して E メールを送信するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-send-email-ses/)

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