aws APIGateway, lambda, sesでメール送信機能実装

# AWSを使って簡単にメール送信機能を作成しよう
メール送信機能って、自前で作るのめっちゃだるくない？
プロトコル、サーバー、セキュリティ、色々考えること多い,,,,,.
そこで、簡単に作れるAWSのやり方を書きます

## 使用するサービス
- apigateway
- lambda
- ses

## 手順
### 1. APIGatewayの設定
![スクリーンショット 2023-12-23 7.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/7a413c77-3800-4b42-c197-38bb6ee596d4.png)
REST APIを選択
![スクリーンショット 2023-12-23 7.23.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/7c63074d-160e-e87e-84b7-3ccd0bdc9de2.png)
新しいAPIを選択し、任意のAPI名を入力し、APIを作成する
![スクリーンショット 2023-12-23 7.23.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/1ba97425-b6b5-c7e4-5000-e10368e5c8b9.png)
後ほど、設定しますが、一旦次へ行きます。

### 2. Lambdaの設定
![スクリーンショット 2023-12-23 7.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/d64c0857-c7cd-b116-9165-964b3e214472.png)
一から関数を作成します。
![スクリーンショット 2023-12-23 7.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/740b9887-ce24-989a-ffcb-6832a68654be.png)

次に、コードを記述します。
```js
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
const ses = new SESClient({ region: "ap-northeast-1" });

export const handler = async(event) => {
  const command = new SendEmailCommand({
    Destination: {
      ToAddresses: ["送信先のメールアドレス"],
    },
    Message: {
      Body: {
        Text: { Data: "Test" },
      },

      Subject: { Data: "Test Email" },
    },
    Source: "送信元のメールアドレス",
  });

  try {
    let response = await ses.send(command);
    response.statusCode = 200;
    response.body = "OK";
    return response;
  }
  catch (error) {
    return error;
  }
  finally {
    // finally.
  }
};

```
これで実行テスト！！
とは行きません。メールアドレスの検証が必要です。

### 3. SESの設定
![スクリーンショット 2023-12-23 7.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/a6d06a57-dec7-4e43-0b5b-2aade1b3f59e.png)
IDの作成をします。
ここでは、開発で使用するメールアドレスを登録してください。
![スクリーンショット 2023-12-23 7.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/123dc768-9035-a85e-85e5-c63b7a6f1c8f.png)
ID作成完了したら、画面右上の新しい確認Eメールへをクリックします。
![スクリーンショット 2023-12-23 7.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/fa7a4831-14ea-b14e-b8b5-7a56b0de8e3d.png)
クリック後、登録したメールアドレスへ以下のようなメールが届いています。
リンクをクリックします。
![スクリーンショット 2023-12-23 7.36.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/fa93f530-1a3e-169e-b466-431d6c732958.png)
おめでとうございますの画面が表示されればメールアドレスの検証に成功しました。
これで使用できます。
![スクリーンショット 2023-12-23 7.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/3e4060aa-d4ce-7639-adc6-d5eadab1023a.png)

本番環境では、サンドボックスというものがあり、その設定が必要になります。

これで、lambdaを実行すると,,,
まだ送信できません。エラーになるはずです。
なぜなら、lambdaにはメールを送信する権限が付与されていないからです。
なので、権限を付与しましょう

### 4. lambdaに権限付与
IAMサービスを開きます。
ポリシーを選択します
![スクリーンショット 2023-12-23 23.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/0afd093b-6a3b-c020-6810-e58d6c745891.png)
ポリシーの作成をクリック
![スクリーンショット 2023-12-23 23.55.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/e889065b-dd53-52aa-58ff-9481d16e0825.png)
アクセス許可を指定で、JSONを選択し、以下のポリシーを追加してください
```json
{
 "Version": "2012-10-17",
 "Statement": [
 {
 "Effect": "Allow",
 "Action": [
 "ses:SendEmail",
 "ses:SendRawEmail"
 ],
 "Resource": "*"
 }
 ]
}
```
![スクリーンショット 2023-12-23 7.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/53b94a26-d000-f3d6-8c74-48a43bf20c77.png)
確認して作成します。
![スクリーンショット 2023-12-23 8.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/6740b82c-3e1a-c982-437a-5b43faba4571.png)
![スクリーンショット 2023-12-23 8.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/c9f730ef-f801-ac94-1414-ab6fefa9f548.png)
次に作成したポリシーをロールに付与します。
ロールを作成してください　入力は任意の文字。
![スクリーンショット 2023-12-23 8.02.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/386ec751-5783-8854-591d-f19c0cfddea7.png)
![スクリーンショット 2023-12-23 8.02.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/7b7e4799-22ba-e711-dd26-04e003b5930b.png)
![スクリーンショット 2023-12-23 8.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/049ef4c9-1e9b-7aff-643c-9e01302bdf6a.png)
![スクリーンショット 2023-12-23 8.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/d4ebcde6-6263-b6e5-4cea-20224209a634.png)
![スクリーンショット 2023-12-23 8.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/209450ba-c6c3-6bca-dcb9-1d6b6ebbd214.png)

### lambdaの設定=>アクセス権限=>編集で今作成したロールにします。
![スクリーンショット 2023-12-23 23.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/bf303db1-6a59-f185-d001-1abb94979b77.png)
これで、lambdaのテストでメールが送信されるようになります。

### 最後にAPIGatewayを開いて、エンドポイントを作成したラムダに設定して、テストを実行してみましょう
![スクリーンショット 2023-12-23 8.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/bde2fe39-83a8-0fd5-6bbc-b711424261d9.png)
![スクリーンショット 2023-12-23 8.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/9b25112a-dca6-9cd2-e166-7bcc0a014a2a.png)
![スクリーンショット 2023-12-23 8.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/da7fcfd8-2089-e5e0-3ea0-7296b9f6899d.png)

完了できました。


## セキュリティを意識した設定
これでは、デプロイ後にapiのリンクを叩けば、無限にメールを送信できるようになってしまいます。

apigatewayには、IP制限や鍵の設定ができるのでそれを設定してください。
また、apigatewayのリンクをむき出しにするのもよくないので、別のapiを用意して経由する形で扱うのがいいでしょう。


###　最後に
めっちゃ簡単にメール送信機能の作成ができました。
aws様様ですね。

## 参考
- [Lambda と Amazon SES を使用して E メールを送信する方法を教えてください。](https://repost.aws/ja/knowledge-center/lambda-send-email-ses)
- [特定の IP アドレスのみが API Gateway REST API にアクセスすることを許可するにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/api-gateway-resource-policy-access)
- [API Gateway コンソールを使用して API キーをセットアップする](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-setup-api-key-with-console.html)
- [Amazon SES サンドボックス外への移動
](https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html)
- [Amazon API Gateway で AWS Lambda を使用する](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-apigateway.html)