AWS構築手順SESを利用したメール送信環境

本章では、AWS-SESを利用したメール送信環境構築について説明します。

SESへのドメイン登録

  1. AWSコンソールよりSES (Simple Email Service) ページを表示します。東京リージョンでのサービスは提供されていないため、リージョンは米国西部オレゴンを選択します。 SESキャプチャ1
  2. Domainsメニューよりドメインを登録します。Verify a New Domainをクリックします。Domainにはメールアドレスにしたいドメインを入力し、Generate DKIM settingsのチェックをオンにします。
    DKIMにより、メールの正当性を証明することになりますので、DKIMの設定を行うことを推奨します。 SESキャプチャ2
  3. 以下のような画面が表示されます。この情報をRoute53に登録するために、Use Route53をクリックします。 SESキャプチャ3
  4. すると、どのサービスをRoute53に登録するか選択が求められます。警告にも表示されているとおり、受信メールについては未構築(後ほどWorkMailから設定)ですので、この段階ではチェックを外したままとします。
    DomainVerificationRecord, DKIM RecordSetの2つのチェックは有効化し、Create Record Setをクリックします。 SESキャプチャ4 その結果、Route53に自動的にRecordSetが登録されます。 SESキャプチャ5
  5. しばらくして、ドメインがVerifiedになることを確認します。 SESキャプチャ6 SESキャプチャ7
  6. このタイミングで一度メールをテストします。SESでは、初期状態はサンドボックスモードとなり、認証したアドレスへのみメールが送信できます。この解除は後ステップで行いますので、まずは一度、サンドボックスでメールをテストします。
    Email AddressesにてVerify a New Email Address をクリックします。 SESキャプチャ8 AWSからメールが届くので、リンクをクリックして認証します。 SESキャプチャ9
  7. StatusがVerifiedになったことを確認したら、そのアドレスを選択してSend a Test Emailをクリックします。
    サンドボックスモードですので、認証されたアドレスへのみ送信可能です。FromとToに同じアドレスを設定して送信します。 SESキャプチャ11 届いたメールのヘッダーにDKIMが記載されていて、迷惑メール扱いになっていないことを確認します。 SESキャプチャ12

バウンスメール対策

サンドボックスモードの解除を申請するにあたり、バウンスメールへの対処が必要となります。 バウンスメールが5%を超えると、メール配信が停止されます。

EC-TRIPでは、DBのbounce_mailsテーブルに登録されているメールアドレスは送信対象外とする仕組みを設けています。 そこで、BounceとなったアドレスをAWS SQSを利用して自動的に取得し、bounce_mailsテーブルへ登録する処理を設けることが理想となりますが、この処理は現時点では未実装要です。

バッチ処理を未実装で運営する場合は、下記の運用での対策としてください。 バウンスメールが発生したタイミングでAWS SNSを通じて管理者メールに通知する仕組みを導入し、bounce_mailsへ手動で登録する流れとなります。

SNSの設定

バウンスメールをSNS (Simple Notification Service) 経由でメール通知されるよう、SNSの設定を行います。

  1. AWSコンソールよりSNSを開き、Get Startedをクリックします。 SESキャプチャ13
  2. Create topicを選択し、任意の名前を入力して作成します。 SESキャプチャ14 SESキャプチャ15
  3. 作成したTopicにてCreate subscriptionを選択し、通知先を設定します。 SESキャプチャ16 ProtocolはEmailとし、Endpointに通知先のメールアドレスを入力します。 SESキャプチャ17 作成すると指定したアドレスにSNSの認証メールが届くので、リンクをクリックして認証します。 SESキャプチャ18

SESでのバウンスSNS設定

  1. SNS作成後、改めてSESのページを開き、Domainsから、対象のドメインを選択します。 SESキャプチャ19
  2. NotificationのEdit Configurationをクリックします。 SESキャプチャ20
  3. Bouncesのリストから、先程作成したSNSのses_bounceを指定して保存します。 SESキャプチャ21
  4. 登録したら、バウンスメールが通知されるかテストします。AWSにはバウンステスト用のメールアドレスbounce@simulator.amazonses.comが用意されているので、こちらを利用します。
    SESのDomainsメニューにて、前手順で認証したdomainを選択し、Send a test emailをクリックします。
    Fromには適当な名前(testとか)を設定し、Toにbounce@simulator.amazonses.comを指定して送信します。 SESキャプチャ22 以下の通り、SNSよりBounceを通知するメールが届くことが確認できたら完了です。実際には、ここに記載されたメールアドレスをbounce_mailsテーブルへ登録することで、次回以降はこのアドレスへのメール送信を取りやめることが可能となります。 SESキャプチャ23

以上でバウンスメールへの対策を完了とします。続けて、SESのサンドボックス解除申請を行います。

サンドボックスモード解除

  1. サンドボックスの解除申請は、SESのSending StatisticsページからRequest a Sending Limit Increaseをクリックして申請します。 SESキャプチャ24
  2. 以下のような内容で申請します。申請内容は各自記載ください。 SESキャプチャ25
  3. しばらくすると(1日前後)、AWSよりサンドボックスモード解除の通知が届きます。 SESキャプチャ26
  4. 認証済みでないメールアドレスにもメールが送信できることを確認してください。 SESキャプチャ27

SES用のIAM作成と.env設定

以上でSESの構築は完了しました。ここからは、システムから構築したSESを使ってメール送信できるように設定を進めます。
システムからSESを使うには、IAMを作成する必要があります。

IAM作成

  1. SES用のIAMは、SESページの「SMTP Settings→Create My SMTP Credentials」より作成します。 SESキャプチャ28 そのまま作成をクリックします。 SESキャプチャ29 作成したら認証情報をダウンロードしておきます。 SESキャプチャ30
  2. 次に、作成されたIAMの権限(ポリシー)を編集します。初期状態ではses:SendRawEmailのみ付与されていますので、他にses:SendEmailを追加します。
    IAMのページを開き、ユーザーの中から作成されたses-smtp-userを選択します。 SESキャプチャ31 アタッチ済みのポリシー「AmazonSesSendingAccess」を選択し、ポリシーの編集をクリックします。 SESキャプチャ32 編集画面にて、以下のようにActionを配列にして"ses:SendEmail"を追加して保存します。
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ses:SendRawEmail",
                    "ses:SendEmail"
                ],
                "Resource": "*"
            }
        ]
    }
    
  3. 以上でIAMの作成は完了です。ダウンロードした認証情報csvをもとに、WebAppサーバーの.envへ反映します。
    .envには、SMTPサーバーのADDRESSなど必要になります。SESページのSMTP Settingsより情報を確認してください。 SESキャプチャ33
    $ vi /var/www/ec-trip/shared/.env
    
    # Mail
    SMTP_USERNAME="****" # Smtp Username
    SMTP_PASSWORD="AuXUkkI1o4XQ5TM+po5cKF/ue2nHamnUi8i4Pqp+a1OW" # Smtp Password
    SMTP_ADDRESS="email-smtp.us-west-2.amazonaws.com"
    SMTP_PORT="587"
    SMTP_DOMAIN="ec-trip.site" # サービスのドメイン
    
  4. .envを編集したので、Unicornを再起動します。
    $ cd /var/www/ec-trip/current
    $ kill -QUIT `cat /var/www/ec-trip/shared/tmp/pids/unicorn.pid`
    $ bundle exec unicorn -c /var/www/ec-trip/current/config/unicorn.rb -E production -D
    
  5. 以上で設定完了です。サービスから実際にメールを送信して動作確認をしてください。 SESキャプチャ34

長くなりましたが、SESの設定を行いサービスからメール配信を可能としました。将来的に、バウンスメールの自動対応を組み込んでいきたいと思います。
次章では、WorkMailを利用した受信メール環境を構築していきます。