見ながらやろう！ AWSを使った「簡単!! 独自ドメインの送受信システム構築」#後編

前編はこちら！！

https://qiita.com/nago3/items/bdcbc7fac604aea9b2c1


## 続きとして

こちらは「見ながらやろう！ AWSを使った「簡単!! 独自ドメインの送受信システム構築」」の後編です。
前編を終えた後というのが前提です。

## 注意！！！

今回の記事は初学者向け、もしくは自分のようなアドバイスがなくて解決方法を模索している方が対象です。<font color=red>周りに正しい知識や経験を聞ける方や、経験の長い皆様は「ほーん、こんな奴もいるんだ」程度で認識していただけると幸いです。</font>



## 今回やったこと

**メールの送受信を(従業員全体が)使い慣れているGmailでできるようにする**

前提条件:

<font color=red>#前編が終わっていること</font>
ローカルディレクトリに<font color=red>[ temporary ]というディレクトリが **存在しない** こと</font>

作業内容:

**#前編**

1. AWSでSESの設定をする
  1. 送信の設定に使うメールアドレスの登録
  2. 送受信の設定に使うドメインの登録
  3. IAMユーザ作成
  4. メールの受信用S3バケットの作成、設定
  5. Gmailでの送信設定

```
#後編   <- (今回はこれ)

2. SESの送信制限の解除
  1. サポート宛に送信制限解除の連絡をする
3. SESで受信した内容をGmailに転送する
  1. ライブラリのデータを自分用に設定し直す
  2. Lambda用の作業用[ IAM Role ]を作成する
  3. Lambdaの関数作成
  4. SESでLambdaの呼び出すルールを追加する
  5. 受信用S3バケットにライフサイクルポリシーを設定する
4. 最終確認
```

## 2. SESの送信制限の解除

SESの送信制限...

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html

SESには送信制限が存在しています。同時に<font color=red>制限解除するまでは
サンドボックス内での操作</font>となり、外部との接続は限定的になっています。
まずは送信制限の解除から始めましょう。



### 2-1: サポート宛に送信制限解除の連絡をする

前編の続きからスタートします
再び[ SES ]のコンソールにログインしましょう

<img width="1440" alt="1-1-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/f48c5fac-244b-9150-6e77-375d621e3f70.jpeg">

次にサイドバー[ Sending Statistics ]を見てみましょう
現時点ではサンドボックスのため、制限がかかっています
画面上部の[ Request a Sending Limit Increase ]をクリックしましょう

<img width="1404" alt="2-1-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/24bc2ce1-ca82-6455-2f07-fd8bec2d9c3b.jpeg">

今度は[ サポート ]の画面に移動します。
自動で[ SES送信制限 ]までの入力が終わっているはずです

<img width="1076" alt="2-1-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/3ee0ea69-cb3d-0670-08dc-83854ea2cd88.jpeg">

各種項目を記入していきましょう
まずは分類からです
> ・<font color=red>規約やAUPはしっかり読みましょう</font>
> ・メールの種類は今回は取引にしています。システムなど、場合にあった項目を選択しましょう
> ・メールは許可のない不特定多数に送ることは認められません。
> ・バウンス等の処理は[ Lambda ] などのサービスを用いて対応する記事を別途作成予定です

<img width="573" alt="2-1-3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/1820c488-8299-1e3b-80d0-7dc223f048a9.jpeg">

リクエスト内容です
> ・送信クォータ[ 50000 ]
> ・最大送信レート[ 14 ]

<img width="797" alt="2-1-4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/831bfacc-7023-7edc-da73-9a1c67be8a60.jpeg">

最後に制限解除の理由を説明しましょう
皆さんの申請理由をここに述べましょう
終わりましたら[ 送信 ]を押して完了です

<img width="1028" alt="2-1-5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/6aaa427e-57d2-e061-fcab-c3be759a14a7.jpeg">

<font color=red>制限解除はAWS側に行ってもらうので、多少時間がかかります</font>


## 3. SESで受信した内容をGmailに転送する

参考にさせていただいた記事:

https://tech.taiko19xx.net/entry/2018/05/01/195119



今度は現在[ S3 ]で受信しているメールをGmailに転送する設定を行います。
SESでは[ POP3 ]などの受信に対応していません(別途複数のアクションがあるのですが今回は省略)
そのため[ Lambda ]を用いて転送処理を行います。


**今回はこちらのライブラリを使わせていただきます**

https://github.com/arithmetric/aws-lambda-ses-forwarder


### 3-1: ライブラリのデータを自分用に設定し直す

まずはライブラリのコードをクローンさせてもらいましょう
ライブラリにアクセスし、URLをコピーします

<img width="1440" alt="3-1-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/fec91448-4a95-01e4-2c7a-06813ec5df80.jpeg">

今度は自分のローカルに一時的な作業ディレクトリを作って作業をします
以下はコピペである程度作業ができるようにしています。

<font color=red>以下は[ Terminal ]での作業です</font>

[ npm ]のインストール方法はこちらの記事を参照してください

https://qiita.com/Alex_mht_code/items/422f5ce10d9c9d5729b7

```
cd ~

mkdir temporary && cd temporary/

git clone https://github.com/arithmetric/aws-lambda-ses-forwarder.git

mkdir my-lambda-ses

cp -r aws-lambda-ses-forwarder/example/ my-lambda-ses/

cd my-lambda-ses/
```

ファイルの中身を書き換えていきます
<font color=red>下のコードをコピペして書き換えてください<font>

書き換える際は好きなテキストエディタをご利用ください

```
cat << ETX > index.js

var LambdaForwarder = require("aws-lambda-ses-forwarder");

exports.handler = function(event, context, callback) {
  // See aws-lambda-ses-forwarder/index.js for all options.
  var overrides = {
    config: {
      fromEmail: "noreply@example.com",  // 転送元に使うアドレス
      emailBucket: "s3-bucket-name",     // 前回作成したS3バケット名
      emailKeyPrefix: "mails/",          // S3のプレフィックス名
      forwardMapping: {
        "info@example.com": [            // 受信用に設定したメールアドレス
          "example.john@example.com"     // 受信メールの転送先Gmailアドレス
        ]
      }
    }
  };
  LambdaForwarder.handler(event, context, callback, overrides);
};

ETX
```

終わったら[ npm install ]をしてZIP化します

```
cd temporary/my-lambda-ses/

npm install

zip -r my-lambda-ses ./*
```

以上で[ Terminal ]画面での作業は終了です


### 3-2: Lambda用の作業用[ IAM Role ]を作成する

作業はAWSに戻ります
外面左上[ サービス ]から[ IAM ]を選択します

<img width="1440" alt="3-2-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/285c59fc-2c73-0a81-3632-472c4ec90f92.jpeg">

サイドバー[ ロール ]から[ ロールの作成 ]をクリックします

<img width="810" alt="3-2-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/1e4ea61a-8a2a-31f8-6b23-9e9409a3e66a.jpeg">

エンティティに[ Lambda ]を選択して次のステップに進みます

<img width="1440" alt="3-2-3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/721cd608-74b1-88bc-9746-6b85504bc679.jpeg">

[ ポリシーの作成 ]をクリックします

<img width="918" alt="3-2-4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/8c7aa689-d28f-9dd2-d588-e6cdc54750f7.jpeg">


**<font color=red>コード下部の[ S3-BUCKET-NAME ]の部分は。自分のメール用S3バケットの名前に変更してください</font>**


```
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
         ],
         "Resource": "arn:aws:logs:*:*:*"
      },
      {
         "Effect": "Allow",
         "Action": "ses:SendRawEmail",
         "Resource": "*"
      },
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetObject",
            "s3:PutObject"
         ],
         "Resource": "arn:aws:s3:::S3-BUCKET-NAME/*"
      }
   ]
}
```

ポリシーの作成画面に移動するので、[ JSON ]を選択し、上のコードを編集したものを貼り付けます

<img width="1440" alt="3-2-5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/b8a1d2e4-b7a4-16a8-c090-ffe6c0d1bdde.jpeg">

ポリシーに名前と説明を入力します
今回は[ **lambda-send-mail-policy** ]にしました。

<img width="1440" alt="3-2-6.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/18b58d47-e6be-a2ed-f1e6-c0fe7e202f3a.jpeg">

確認のボタンを押すと、コンソール画面で作成されていることが確認できます

<img width="1440" alt="3-2-7.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/3b1d706a-0b1f-9624-e0cb-edbfcd5b331a.jpeg">

元の画面に戻りロールの設定の続きを行います
更新ボタンを押し、作成したポリシーを検索窓に入力します
ポリシーが見つかったらチェックして先に進みます

<img width="1440" alt="3-2-8.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/b7b23670-b724-69ed-7d94-19c12cb713cd.jpeg">

<img width="1440" alt="3-2-9.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/2f0e9551-aeaa-7fc0-c5e4-0d2ee3649369.jpeg">

ロール名に[ **lambda-send-mail-role** ]と入力すれば完了です

<img width="1440" alt="3-2-10.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/0725decc-52a4-e74d-ffd2-c6bdf8905dd2.jpeg">

コンソール画面で作成されていることが確認できます

<img width="936" alt="3-2-11.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/eb1215d1-1cb6-8487-9850-7efef5a983e0.jpeg">


### 3-3: Lambdaの関数作成

受信設定の中心になるLambdaの関数を設定していきます
外面左上[ サービス ]から[ Lambda ]を選択します

<img width="689" alt="3-3-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/8cb2c74a-e034-bf46-ff1c-b21450c71c1d.jpeg">

画面内の[ 関数の作成 ]をクリックします

<img width="1440" alt="3-3-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/6f923823-76ef-9833-4801-9a7a8ada3488.jpeg">

関数の作成画面になります
> 名前: mail-fowarding-[Gmailのアドレス]
> ランタイム: Node.js 8.10
> 既存のロール: 先ほど作成したIAMロール

<img width="1440" alt="3-3-3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/fd547a53-9283-e99a-aa39-4b5885415877.jpeg">

Lambdaのコンソール画面になります
ロールが間違っていなければ、アクセス許可されているサービスやランタイムが
下の画像のようになっているはずです

<img width="1440" alt="3-3-4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/c387cb81-fddc-4cf3-e10d-87d7c2bee580.jpeg">

基本設定のタイムアウトを[ 1分 ]に設定します

<img width="1402" alt="3-3-7.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/7302b53f-9df3-3d9f-37f8-c3fbda47ad1c.jpeg">

コードエントリタイプを[ .zpiファイルをアップロード ]に変更します
Macの画面ですが、先ほど作成したZIPファイルを選択します

<img width="1440" alt="3-3-5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/be199267-e606-6512-e990-3185f884eeed.jpeg">

アップロードが完了したら画面右上の[ 保存 ]をクリックします

<img width="1282" alt="“SS“ 2019-02-12 at 10.05.42.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/1f7b3c20-c06b-e959-37ae-7f0e9826625d.jpeg">

以上で[ Lambda ]での作業は完了です


### 3-4: SESでLambdaの呼び出すルールを追加する

SESのコンソールに移動します
サイドバ[ Rule Sets ]から[ View Active Rule Set ]をクリック

<img width="700" alt="3-4-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/02bd02a4-e26a-7cc1-a08d-fad4b0d82799.jpeg">

前回製作したルールをクリック

<img width="887" alt="3-4-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/441f5f70-900b-12c2-d2a8-32fdefc5d7c4.jpeg">

[ Actions ]で新しくルールを追加します
[ Add action ]から[ Lambda ]を選択します

<img width="879" alt="3-4-3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/c03bbe0c-afdf-1a8b-8000-6bcf5582c16f.jpeg">

<img width="787" alt="3-4-4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/a035acdd-4cc2-d0b5-76dd-b0dbe96b7964.jpeg">

[ Lambda function ]から先ほど作成した関数を選択します

<img width="1440" alt="3-4-5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/d85a51f0-d702-3c43-a37f-230c2c3db214.jpeg">

作っただけではアクセスの許可がないので、許可します

<img width="599" alt="3-4-6.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/20b7b0d7-3d27-42ff-4805-d38b8b0941d9.jpeg">

以上でSESの設定終了です


### 3-5: 受信用S3バケットにライフサイクルポリシーを設定する

まずはS3の作成したバケットに移動します
タグの[ 管理 ]から[ ライフサイクル ]、[ライフサイクルルールの追加]を選択します

<img width="1440" alt="3-5-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/04e11835-ee6f-deeb-b495-054580410d0a.jpeg">

ルール名に[ tmp-mail-life-cycle ]と入力します

<img width="697" alt="3-5-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/c14bd860-9b67-ebbc-911e-ac5e1adcb2b5.jpeg">

<img width="703" alt="3-5-3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/418fe233-5c11-2305-774c-c67164e82e67.jpeg">

失効の設定を[ 現行バージョン ]で[ 3 ]日後と記入します
<font color=res>これはお好みの数字でどうぞ</font>

<img width="700" alt="3-5-4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/d4eb2570-cce1-1689-5044-2c398ab9f3e6.jpeg">

最後に確認をして[ 保存 ]します

<img width="702" alt="3-5-5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/e81fdab8-ad34-beb0-e76d-4fa24ec3f7d1.jpeg">

コンソール画面で反映が確認できました

<img width="1440" alt="3-5-6.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/9b891622-d1a1-fb6a-153a-636703697696.jpeg">




## 4: 最終確認

最後にメールが確かに転送されているか確認します
自分が持っている適当なメールアドレスから、受信したい独自ドメインのメールアドレスに送信します

<img width="600" alt="3-5-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/b20fd45f-a428-8a03-c5b6-9cd4b68ca2a5.jpeg">

S3にメールが入っていますね

<img width="1043" alt="3-5-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/82f565e4-4005-76c7-94d5-4a92bccae4cc.jpeg">

メールが先ほど設定した[ index.js ]で設定した形で受信できているはずです

<img width="938" alt="3-5-3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/13e851e5-e6b6-6d4a-10fe-2d033fd762d9.jpeg">

以上で作業終了です、お疲れ様でした！！


## 後片付け

最後にローカルディレクトリを片付けましょう

<font color=red>temporaryディレクトリに大事なファイルが存在しないことを確認してください</font>

また、このディレクトリ以外で作成した場合は、各人で判断して削除をお願いします

```
cd ~/

rm -rf temporary/
```


## 終わりに

ここまでお付き合いいただき、ありがとうございました。
以上でSESを使ったGmailでの送受信についての作業を完了します。

前半でも述べたことですが、SESのサービスは日本のキャリアメールには向きません。
そちらを念頭に置いた上でご利用いただくようにお願いします。

アドバイスや意見、感想などございましたら連絡をお待ちしております。



## 参考、引用

SES-Gmail受信:
https://tech.taiko19xx.net/entry/2018/05/01/195119

Lambdaライブラリ:
https://github.com/arithmetric/aws-lambda-ses-forwarder

npm: 
https://qiita.com/Alex_mht_code/items/422f5ce10d9c9d5729b7