【AWS】SESとS3でサーバレスなメールの送受信環境を構築する
こんにちは。クラウドソリューショングループのshimizuyです。
『freenomやお名前ドットコムで独自ドメイン取得したことだし、独自ドメインのメールアドレス宛にテストメールを送受信できる環境が欲しいなぁ…でもいちいちEC2でメールサーバ立てるのはちょっと面倒だなぁ…』なんて思ったことありませんか?
そこで今回は、SESとS3を使用したサーバレスなメールの送受信環境を構築してみようと思います。
目次
やりたいこと
freenomやお名前ドットコムなどで取得した独自ドメインのメールアドレスに対して送信されたメールを送受信できる環境を構築しようと思います。
例えば、”hoge@example.com” というメールアドレス宛てのメールを、Amazon SESを使ってサーバレスに送受信したいというケースを想定しています。
EC2の作成を前提とした構成ではないため、その点ご認識の上で読み進めてくださいm(_ _)m
構成について
今回のユースケースにおける構成は以下の通りです。
この構成図を見て「なんで東京リージョンとバージニア北部リージョンをわざわざ分けて構築してるんだ?」と思ったそこのあなた、良い着眼点をお持ちですね!
上記のようにリージョンを分ける理由としては、そもそもAmazon SESでメールの受信オプションを設定できるリージョンが限られてるからなんです。
少なくとも2023年5月24日時点ですと、
- us-east-1
- us-west-2
- eu-west-1
のみで受信オプションの設定が可能なようです。
構築手順
作業の簡単な流れとしては、
- 無料の独自ドメインを取得
- 東京リージョンでSESの送信用ドメイン設定
- バージニア北部リージョンでSESの受信用ドメイン設定
- バージニア北部リージョンでSESの受信ルール設定とS3への紐づけ
- SES同士でのメール送受信テスト
となります。
それではさっそく構築に入っていきましょう!
実際に構築してみた
1. 無料の独自ドメインを取得
無料の独自ドメインはfreenomやお名前ドットコムなどで入手可能です。
こちらの手順に関しては「freenom」や「お名前ドットコム」について調べていただければ解説記事などあるかと思いますので今回は省略します。
今回はお名前ドットコムで独自ドメインを取得しました。
2. Route53で新しいホストゾーンを設定する
まずは、独自ドメインをRoute53で使用するために「ホストゾーン」を作成しましょう。
AWSのマネジメントコンソールからRoute53のホストゾーン画面を開き、「ホストゾーンの作成」をクリックします。
ホストゾーンの作成画面が表示されたら以下のように設定します。
- ドメイン名:独自ドメイン名(例:example.comなど)
- タイプ:パブリックホストゾーン
設定が完了したらページ下部の「ホストゾーンの作成」をクリックします。
ホストゾーンが作成されると、NSタイプとSOAタイプのレコードがそれぞれ生成されます。
3. お名前.comにネームサーバを登録する
作成したRoute53のホストゾーンとお名前.comの独自ドメインとを紐付けるために、Route53で先ほど生成された4つのネームサーバーを独自ドメインのネームサーバーとして設定します。
お名前.comにログインして画面上部メニューの ネームサーバーの設定 ▶ ネームサーバーの設定 を選択します。
ネームサーバーの設定画面でドメイン名を選択して「他のネームサーバーを利用」を選択、ネームサーバー情報を入力の欄にRoute53で表示されたネームサーバーの値をすべて入力して「確認画面へすすむ」をクリックします。
※ネームサーバ入力の際、末尾のピリオド”.”は除いて入力してください!
内容に問題がなければ「設定する」をクリックします。
4. 東京リージョン(ap-northeast-1)でSESの送信設定をする
AWSのマネジメントコンソール右上に表示されているリージョンが東京(ap-northeast-1)であることを確認したら、SESの検証済みID画面を開き「IDの作成」をクリックします。
IDの作成画面が表示されたら、まずはIDの詳細を以下のように設定します。
- IDタイプ:ドメイン
- ドメイン:独自ドメイン名(例:example.comなど)
- カスタムMAIL FROM ドメインの使用:有効
- MAIL FROMドメイン:mail(任意の名称でも構いません)
- MX障害時の動作:デフォルトのMAIL FROMドメインの使用
- DNSレコードのRoute53への発行:有効
続いてドメインの詳細を以下のように設定します。
- IDタイプ:Easy DKIM
- DKIM 署名キーの長さ:RSA_2048_BIT
- DNS レコードの Route53 への発行:有効
- DKIM 署名:有効
設定が完了したらページ下部の「IDの作成」をクリックします。
「DNSレコードのRoute53への発行」を有効化したので、IDを作成すると自動的にRoute53にレコードが追記されます。
正常に登録が完了して、数分するとドメイン認証が完了し、IDステータスが「検証済み」になります。
5. バージニア北部リージョン(us-east-1)でSESの受信設定をする
AWSのマネジメントコンソール右上に表示されているリージョンがバージニア北部(us-east-1)であることを確認したら、SESの検証済みID画面を開き「IDの作成」をクリックします。
IDの作成画面が表示されたら、IDの詳細を以下のように設定します。
- IDタイプ:ドメイン
- ドメイン:独自ドメイン名(例:example.comなど)
- カスタムMAIL FROM ドメインの使用:有効
- MAIL FROMドメイン:mail-us-east-1(任意の名称でも構いません)
- MX障害時の動作:デフォルトのMAIL FROMドメインの使用
- DNSレコードのRoute53への発行:無効
ドメインの詳細に関してはデフォルトのままでOKです。
設定が完了したらページ下部の「IDの作成」をクリックします。
「DNSレコードのRoute53への発行」を有効化したので、IDを作成すると自動的にRoute53にCNAMEレコードが追記されます。
正常に登録が完了して、数分するとドメイン認証が完了し、IDステータスが「検証済み」になります。
SES でメールを受信するためには、該当のドメインで MX レコードを作成し、SES の受信用エンドポイントを指定する必要があります。詳細は次の Document を参照してください。
参考:Amazon SES による E メール受信のための MX レコードの公開
AWSのマネジメントコンソールからRoute53のホストゾーン画面を開き、今回使用している独自ドメインを選択したら「レコードを作成」をクリックします。
レコードを作成画面が表示されたら以下のように設定します。
- レコードタイプ:MX – メールサーバーを指定します
- レコード名:MAIL FROMドメイン名
- 値:10 inbound-smtp.us-east-1.amazonaws.com
設定が完了したらページ下部の「レコードを作成」をクリックします。
6. バージニア北部リージョン(us-east-1)でEメール受信のルールを設定する
AWSのマネジメントコンソール右上に表示されているリージョンがバージニア北部(us-east-1)であることを確認したら、SESのEメール受信画面を開き「ルールセットの作成」をクリックします。
ルールセット名は任意の名称ですが、今回は「xxxxxx.com-receive」の形式で設定します。
「xxxxxx.com-receive」画面が表示されたら「ルールの作成」をクリックします。
ルールの作成画面が表示されたら、受信ルールの詳細を以下のように設定します。
- ルール名:xxxxxx.com-receive(任意の名称でも構いません)
- ステータス:有効化
- Transport Layer Secutiry (TLS) :なし
- スパムとウイルススキャン:有効化
設定が完了したらページ下部の「次へ」をクリックします。
受信者の条件はSESの受信設定の「MAIL FROMドメイン」を指定してください。
設定が完了したらページ下部の「次へ」をクリックします。
補足になりますが、上記の受信者の条件設定は特定のメールアドレスだけでなくドメインすべてのメールを受信するなど用途に合わせて設定可能です。次のガイドラインの設定例を参考にしてください。
続いて、アクションの追加画面では、新しいアクションの追加から「S3バケットへの配信」を選択します。
「S3バケットへの配信」を選択するとS3バケットの設定項目が表示されるため以下のように設定します。
- S3バケット:「xxxxxx.com-mailbox」という名称で新規にS3バケットを作成(任意の名称でも構いません)
- オブジェクトキープレフィックス:mailbox
設定が完了したらページ下部の「次へ」をクリックします。
レビュー項目で内容に問題ないことを確認したら「ルールの作成」をクリックします。
「xxxxxx.com-receive」画面に戻り、先ほど作成したルールを選択し、ルールセットを有効化します。
7. メールの受信テスト
東京リージョンのSESからバージニア北部のSESに対してメールを送ってみましょう。
AWSのマネジメントコンソール右上に表示されているリージョンが東京(ap-northeast-1)であることを確認したら、SESの検証済みID画面を開き設定した独自ドメインをクリックします。
画面右上の「テストEメールの送信」をクリックし、メッセージの詳細を以下のように設定します。
- Eメール形式:フォーマット済み
- From-address:example(任意の名称でかまいません)
- シナリオ:カスタム
- カスタム受信者:example@<MAIL FROMドメイン>
- 件名:test mail
- 本文:this is test mail
設定が完了したらページ下部の「テストEメールの送信」をクリックします。
S3のバケット一覧に移動し、先ほど作成したバケット内に「AMAZON_SES_SETUP_NOTIFICATION」以外のファイルが格納されているはずです。
「AMAZON_SES_SETUP_NOTIFICATION」でない方のファイルをローカルにダウンロードした後、ファイルの拡張子を「.mht」に変更したらファイルをブラウザにドラック&ドロップしてみてください。
ブラウザ上に先ほど送信したメールの本文と同じ内容の文章が表示されていればサーバレスのメール送受信環境構築完了となります。
おわりに
構築に挑戦する前はサーバレスであれば楽だろうと高を括っていましたが、終わってみると結構大変でしたね…。
SESといえばLambdaとの連携ができるようになると更に応用の幅も広がるので、興味があれば皆さんもチャレンジしてみてください!