AWS再入門ブログリレー Amazon SES編

こんにちは。ロードバイクに乗っている雰囲気だけ出してる北野です。
梅雨に入ってしまいすっかり自転車通勤しなくなりました。

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2019』の3日目のエントリです。

このブログリレーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2019年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。3日目のテーマは『Amazon SES』です。


目次

はじめに

Eメール。
Webを見ることができているみなさんで使ったことが無い人は居ないでしょう。
もはや、EメールからE(電子)の名前が取れて、当たり前の様に "メール" とも呼ばれています。

主なユースケースとして、以下のような物があげられます。

  • ニュースレター(例:食材宅配会員向けのレシピ)
  • 受領通知(例:購入の確認)
  • 旅行の案内(例:航空券)
  • アカウント関連の通知(例:パスワードのリセット)
  • 法的通告(例:プライバシーポリシーの変更)

当たり前の様に使われているEメールですが、メールサーバーの運用は正直大変です。

Amazon SESとは

Amazon SES(Simple Email Service)はAmazonが提供するフルマネージド型のEメール送受信サービスで、以下の特徴があります。

  • コスト効率に優れたEメール送信サービス
  • 高信頼性・スケーラブル
  • メール受信をトリガーにLambda等の実行が可能

Eメールサーバー運用の難しさ

Eメールを送るからには受信者にそのEメールが届いて欲しいです。 しかし、Eメールは意図した受信者の受信トレイに必ず到達するとは限りません。

スパムフォルダに配信されたり、受信者のメールインフラストラクチャによって拒否されたりします。 メールを確実に受信者の受信トレイに届ける可能性を上げるため、以下のようなことを管理する必要があります。
Amazon SESでは、これらの項目をマネージドに管理していくことが可能です。

Bounces(バウンス)

バウンスは、配信を試みて何らかの問題が発生して送信者に差し戻されたメールのことです。

Amazon SESのベストプラクティスでは、「基本的にバウンス率は 5% 以下に維持してください。」と記載されています。

Amazon SES のベストプラクティス | AWS

Amazon SESのバウンスに関しては公式のFAQにまとめられているので御覧ください。

Amazon SES のバウンスに関するよくある質問 - Amazon Simple Email Service

Complaints(苦情)

Eメールの受信者が、メッセージがスパムであることを示すためにWebメールクライアントの「スパムとして報告」ボタンをクリックすると、このことを苦情として記録します。 このような苦情が多すぎる場合は、送信者がスパムを送信していると判断される可能性が高くなります。

Amazon SESの場合、苦情率が高いとメール配信を停止する可能性があるので、十分な注意が必要です。

Amazon SESのベストプラクティスでは、「基本的に苦情率は 0.1% 未満に維持してください。」と記載されています。

Amazon SES のベストプラクティス | AWS

Amazon SESの苦情に関しては公式のFAQにまとめられているので御覧ください。

Amazon SES の苦情に関するよくある質問 - Amazon Simple Email Service

SESでのメール送信の方法

Amazon SESのメール送信方法は、以下3つの方法があります。

  • マネジメントコンソール
  • Amazon SES API
  • SMTPインターフェイス

今回は、「マネジメントコンソール」と「Amazon SES API(AWS CLI)」の手順をご紹介いたします。

その他の送信方法については、公式ドキュメントをご参照ください。

Amazon SES による E メールの送信 - Amazon Simple Email Service

料金(※2019/07/03時点)

Eメール送信機能は、EC2でホストされているかどうかで無料利用枠の有無が変わります。

利用状況 支払い額 追加料金
Amazon EC2 でホストされているアプリケーションからの E メール送信 月に 62,000 件までは 0 USD。それ以上の E メール送信については 1,000 件ごとに 0.10 USD。 添付ファイル 1 GB につき 0.12 USD。EC2 を使用する場合はその料金。
E メールクライアントやその他のソフトウェアパッケージからの E メール送信 1,000 件ごとに 0.10 USD。 添付ファイル 1 GB につき 0.12 USD。
E メール受信 最初の 1,000 件までは 0 USD。それ以降は 1,000 件ごとに 0.10 USD。 受信メールチャンク 1,000 件につき 0.09 USD

上記の料金は執筆時点(2019/07/03)の料金です。現時点の料金は、公式サイトをご確認ください。

料金 - Amazon SES(Amazon Simple Email Service)| AWS

SESメール送信環境構築手順

リージョンの選択

現在、以下の3つのリージョンでのみサービス提供しています。

  • バージニア北部(us-east-1)
  • オレゴン(us-west-2)
  • アイルランド(eu-west-1)

Eメール送信はミリ秒単位のレイテンシが求められることはほとんど無いと思いますので、 一番代表的なバージニア北部リージョンを選択するのが無難だと思います。

今回は、「バージニア北部(us-east-1)」を利用します。

送信元の確認

まず一番最初にやるのは送信元メールアドレスの確認です。

ここで指定する送信元メールアドレスは受信可能なメールアドレスを指定する必要があります。 下の図のようにボタンをクリックすると、メールアドレス登録用のダイアログが表示されます。

送信用のメールアドレスを入力して、ボタンを押します。

そうすると、登録した送信用メールアドレスに検証要求メールが届きます。 承認するために、リンクをクリックします。

認証に成功すると、「検証に成功しました」というメッセージがブラウザに表示されます。

マネジメントコンソールに戻ると、登録した送信メールアドレスの Status が pending verification(resend) から Verified に変わっていることが確認できます。

Eメールの送信テスト

この時点では送信用のメールアドレス以外にEメールを送信できない、サンドボックスと呼ばれる状態です。 とりあえずちゃんとEメールの送信ができるか自分に送信してテストしてみます。

メールボックスを確認すると、入力した通りのメールが届いていることが確認できます。

SESのメトリクスを確認する

SESでは、以下4つの項目をマネジメンコンソールからモニタリングすることができます。

  • Deliveries(配信)
  • Rejects(拒否)
  • Bounces(バウンス)
  • Complaints(苦情)

今テストメールの送信が問題なく成功したので、Deliveries増加しているのが、グラフから見て取れます。

また、CloudWatchコンソールでは、追加で以下の項目もモニタリングすることが可能です。

  • Sends(送信)
  • Opens(オープン)
  • Clicks(クリック)

オープンとクリックのトラッキングについては、弊社ブログで紹介しております。 詳細はこちらを御覧ください。

Amazon SESで開封やクリックのトラッキングが可能になりました。 | DevelopersIO

Amazon SES API(AWS CLI)を利用する

AWS CLIを使ってSESでメールを送ってみます。以下の様にAWSコマンドを実行するだけで、簡単にEメールを送信することができます。

$ aws ses send-email \
    --region us-east-1 \
    --to <<YOUR_MAIL_ADDRESS>> \
    --from <<YOUR_MAIL_ADDRESS>> \
    --subject "send test by cli" \
    --text "send test body by cli"

サンドボックスを解除する

SESがサンドボックス状態の場合、送信用のメールアドレス以外にEメールを送ることができません。

SESを本番環境で使えるよう、誰にでもメール送信できるようにしたい場合、サポートにリクエストをする必要があります。

[Request a Sending Limit Increase]ボタンを押すとサポートウインドが表示され、そこからリクエストを出すことができます。

リクエスト内容の詳細は、公式ドキュメントをご参照ください。

Amazon SES サンドボックスの外への移動 - Amazon Simple Email Service

送信制限を認識する

SESはインターネットサービスプロバイダー (ISP) 間の信頼関係を保つことを目的として、送信制限があることに注意してください。 この送信制限はリクエストによって引き上げることが可能です。引き上げリクエストの際には、具体的な使用サービスと管理方法を明確に書くようにしてください。

  • 送信クォータ:24時間当たりに送信できる Eメールの最大数。初期は200メッセージ。
  • 最大送信レート:1秒あたりにアカウントから受け付けるEメールの最大数。初期は1秒あたり1メッセージ。

参考:Amazon SES の送信制限の管理 - Amazon Simple Email Service

テンプレートでパーソナライズしたメールの送信

テンプレートを利用して、パーソナライズしたメールの送信も可能です。
弊社ブログで紹介しております。 詳細はこちらを御覧ください。

Amazon SESでテンプレートでパーソナライズしたメールが送信可能になりました | DevelopersIO

SESでのメール受信

SESのメール受信機能は、送信機能とは正直別のサービスにしても良いんじゃないかと思うくらい性質が異なるサービスです。

一言でいえば、メール受信をトリガーにして、その他のAWSサービスを動かすサービスです。

後続処理として、以下4つのAWSサービスを選択できます。

  • S3
  • Lambda
  • SNS
  • WorkMail

また、以下3つのアクションを行うことも可能です。

  • バウンスアクション:送信者にバウンス応答を返すことによって、Eメールを拒否する。
  • 停止アクション:設定された受信ルールの評価を終了する。
  • ヘッダー追加アクション:Eメールにヘッダーを追加する。このアクションは通常、他のアクションとの組み合わせでのみ使用する。

アクションの詳細は、公式ドキュメントを御覧ください。

Amazon SES によるメール受信の概念 - Amazon Simple Email Service

主なユースケースとして、以下の様なものがあげられます。

  • お客様からのメールに応じて自動的にサポートチケットを生成
  • Eメールの自動返信の実装
  • Eメールのバウンスおよび苦情の処理

SESメール受信環境構築手順

AWS構成図

今回はシンプルに、ドメインをRoute 53で管理しつつ、SESでメールを受け取って、そのメールをS3に保存する環境を作ります。

ドメインを準備する

まずは、メールアドレスのためのドメインを準備する必要があります。

Route 53を利用すると、DNS設定が楽ちんなので今回はRoute 53を利用します。

ドメインを追加する

次にSESでドメインの確認をします。

下の図のようにボタンをクリックすると、ドメイン登録用のダイアログが表示されます。

Route 53で登録したドメインを入力します。 Generate DKIM Settingsにもチェックを入れます。

DKIM(Domainkeys Identified Mail)は簡単に言うとEメールの電子署名の仕組みです。
弊社ブログで紹介しておりますので、詳しく知りたい方はこちらを御覧ください。

Amazon SESによるメール送信環境の構築と実践 | DevelopersIO
Amazon SESでSPFとDKIMを用いて高信頼なメールを送る | DevelopersIO

次に進むと、ドメインの検証のためにDNSレコードを登録する必要がでてきます。 Route 53を使っている場合、「Use Route 53」ボタンを押してこのまま登録ができるので楽ちんです。

Warningが出ている、Email Receiving Recordにチェックを入れます。 警告文の通り、Route53のMXレコードを上書きしてしまいます。ドメイン名に間違いが無いか十分に注意してください。

検証が成功すると、各項目が Verified になることが確認できます。

受信ルールの設定

ドメインの設定ができたら受信ルールの設定をします。

Recipientsでドメインを登録します。先程検証が終わったRoute53に登録したドメインを入力します。

先程検証は終わっているので、Verification StatusがVerifiedになってることを確認して次に進みます。

Actionsでメールを受け取った時の動作を登録します。今回はS3を選択します。

Rule Detailsでルールの名前を決めます。自分がわかりやすい名前をつけてください。

Reviewで登録内容に誤りが無いか確認します。問題なければCreate Ruleします。これで構築は完了です。

Eメール受信の確認

ちゃんと受信したEメールがS3に保存できるか、メールを送信して確認してみます。

以下のようにS3へ保存されていることがわかります。

S3に保存されたファイルをダウンロードしてみると、日本語がエンコードされているので内容に問題がないか確認していきます。

---<<省略:ヘッダー情報あれこれ>>---

Subject: =?UTF-8?B?U0VT44OG44K544OI?=
To: ses@example.com
Content-Type: multipart/alternative; boundary="000000000000f77858058cad4221"

--000000000000f77858058cad4221
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

U0VT5Y+X5L+h5qmf6IO9DQpTM+OBq+S/neWtmA0K
--000000000000f77858058cad4221
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">SES=E5=8F=97=E4=BF=A1=E6=A9=9F=E8=83=BD<div>S3=E3=81=AB=E4==BF=9D=E5=AD=98<br clear=3D"all"><div><div dir=3D"ltr" class=3D"gmail_signa=ture" data-smartmail=3D"gmail_signature"><div dir=3D"ltr"><br></div></div><=/div></div></div>

--000000000000f77858058cad4221--

メールタイトルの日本語はBase64エンコードされているので、nkf コマンドあたりでBase64デコードすると読める形になります。

$ echo 'U0VT44OG44K544OI?='|nkf -mBW
SESテスト

メール本文の日本語はUTF-8になっているので、xxd コマンドあたりを使うと読める形になります。

$ echo '=E5=8F=97=E4=BF=A1=E6=A9=9F=E8=83=BD'|xxd -r -p
受信機能%

さいごに

以上、『AWS サービス別 再入門ブログリレー 2019』の3日目のエントリ『Amazon SES編』でした。
メールサーバーを自分で運用すると大変ですが、マネージドで安価に利用できるAmazon SESはとても助かります。派手さはありませんが、Eメールはこれからも利用されていくものだと思うので、これを機会にさわってみるのはいかがでしょうか。

明日(7/4)はかずえ「Amazon DocumentDB」の予定です。お楽しみに!

参考リンク

[AWS Black Belt Online Seminar] Amazon Simple Email Service (SES) 資料及び QA 公開 | Amazon Web Services ブログ