DX攻略部がリニューアルしました!

Amazon SESの設定方法とは?AWSでのメールサーバー構築手順を徹底解説!

こんにちは、DX攻略部のラムネです。

今回この記事では、AWSのSES(Simple Email Service)でメールサーバーを一から構築する方法について解説していきます。

私がSESを初めて利用したときに意外とつまずいたポイントなどがあったため、今回の記事では可能な限り手順を細かくし、わかりやすく解説していきたいと思います。

SESは大量のメールを低コストで配信でき、サービスを開発する上で何かと頻繁に利用されるサービスですので、ぜひ1つ1つ使い方をマスターしていきましょう。

Amazon SES(Simple Email Service)とは?

本題に入る前に簡単にSESの概要だけ触れておきたいと思います。

「SESとはどのようなサービスなのか?」
「SESのユースケースとは?」

このあたりについて簡単にまとめていきますが、「既にそんなこと知っているよ」という方は本見出しは飛ばしてしまってOKです!

逆にSESの利用を検討されている方は下記記事でSESの概要やユースケースについて詳しく解説しているので、興味がある方は下記の記事もチェックしてみてください。

Amazon SESの特徴とは?

SESの特徴は、大量のメールを低コストで安全に送信することが可能な点です。

具体的なユースケースとしては、下記が挙げられるかと思います。

  • メルマガ
  • システム通知
  • お問い合わせ時の自動送信メール

正直、特定の人物へシステム的にメールを使用するサービスの場合は、SESは選択肢の1つとして検討しても良いかと思います。

特に、メルマガなど運営側から一方的にメールを送信するケースの場合はまさに最適です。

SESでメールを送信するための事前準備

  1. AWSアカウントを持っていること (必須)
  2. SES制限の緩和申請が完了していること (任意)
  3. 独自ドメインをRoute53で管理していること (任意)

①については、本記事を読まれている方からすれば言わずもがなかもしれませんが、SESはAWS上のサービスですので、AWSアカウントがなければ当然利用することはできません。

次に②については、SESの初回利用時は利用制限がかかっているため、AWS側に申請し、制限を緩和してもらう必要があります。これについては次の見出しで詳しく解説したいと思います。

最後の③については、必ずしもRoute53でドメインを管理する必要はありませんが、SESとRoute53は同じAWS上のサービスであり、サービス間で自動的に連携してくれるなどの恩恵があるため個人的にはAWS開発で使用するドメインはRoute53で管理することを推奨しています。

ただし、Route53でドメインを管理する場合の注意点として、毎月0.5ドルの維持コストが発生するため、このあたりのコストは妥協する必要があります。

Amazon SESの制限緩和申請とは?(テンプレートあり)

さて、②のSESの制限について詳しく解説していきたいと思います。

先にもお伝えした通り、SESの初回利用時には必ず利用制限がかかった状態(サンドボックス状態)にあります。

  • 登録外のメールアドレスに宛てたメールが送信できない。
  • メール送信回数に制限がある(たしかデフォルトだと一日200回が限度だった気がします。)

そのため、本番利用するためにはその制限をAWS側に解除(厳密には緩和)してもらう必要があり、その手順としてAWS側に申請を出す必要があります。

なお、サンドボックスの解除申請については各リージョン毎に行う必要がありますので、過去に申請した方でもリージョンを変える場合には同様の手続きが必要になります。

具体的な申請方法については、下記の記事で実際に私が実務で申請した際のフォーマットを使いながら解説しているので、興味がある方は参考にしてみてください。

これは余談ですが、普通に申請した場合は、おそらく追加のやり取りが発生するため、制限緩和が承認されるまで目安として2営業日ほどかかるかと思いますが、上記記事で解説しているフォーマット通りに申請すれば1営業日以内に承認されるかと思います。

SESでメールを送信するための設定方法・手順とは?

早速SESでメールが送信できるようになるまでの設定手順について解説していきたいと思います。

なお、今回ご紹介するフローでは必ずしもサンドボックス状態を解除しておく必要はありません。本フローで疎通確認ができた後に本番利用する際は必要に応じてAWS側に申請を行いましょう。

STEP1: SESの管理ページへ移動する

まずはAWSのコンソール画面からSESの管理画面へ進みましょう。

下記画像のようにAWSの検索欄で「SES」と検索すればヒットするはずです。

STEP2: SESにドメインを登録する

無事にSESの管理画面まで到達できたら、リージョンを確認しましょう。

AWSにはリージョン(地域)が選択可能ですが、リージョンによって対応していない機能があり、例えばEメール受信に対応したリージョンは下記の3つだけです。

  • 米国北部(バージニア北部)
  • 米国西部(オレゴン)
  • 欧州(アイルランド)

リージョンはAWSの管理画面の右上から選択可能ですので、好きなリージョンを選択してください。今回の記事では「バージニア北部」で進めていきます。

さて、ここからが本題ですが、まずは左側のメニューにある「検証済みID」をクリックしてください。

次に、画面内の「IDの作成」ボタンをクリックします。

登録画面が開いたら、必要な情報の入力を行いましょう。

初見の場合は少し難しそうな項目が存在するかもしれませんが、とりあえず設定し、知識は後追いで埋めていきましょう。

ドメイン設定

ドメインについては、今回この記事では当サイトのドメインを入力していますが、こちらはご自身が取得しているドメイン名に置き換えてください。

DMARC設定

「カスタムMAIL FROMドメイン」については設定することをおすすめします。
これは送信ドメインの認証技術である「DMARC」に準拠するためですが、これを設定することによりメールの到達率が向上します。

DKIM設定

DKIM設定については「Easy DKIM」を選択し、署名キーの長さは2048BITを選択してください。

次に、ドメインをRoute53のDNSで管理している方は「DNSレコードのRoute53への発行」にチェックを入れ、予め有効化しておきましょう。

これにより、ID作成と同時にRoute53に自動的に必要なレコード情報が登録されます。ドメインをお名前ドットコムなどの別サービスで管理している方はこちらのチェックは不要です。

最後に、「DKIM署名」は必須で有効化させておきましょう。

以上、ここまで設定できたら、作成ボタンを押し、登録を完了させましょう。

STEP3: DNSに指定レコードを追加

STEP2が完了したら、続いてDNSへのレコード追加/確認を行っていきます。

Route53のDNSの場合(確認のみでOK)

SESで登録したドメインをRoute53でDNS管理(ホスト登録)している方はSTEP2の登録ボタンを押したタイミングで自動的に必要レコードがRoute53に追加されているので確認だけでOKです。

今回の場合、5つのレコードが新しく追加されていれば正常です。

Route53以外のDNSの場合(手動追加)

SESで登録したドメインをRoute53以外で管理している場合は、管理しているサービスのDNS登録画面から、SESのID詳細画面に表示されている5つのレコードを手動登録しましょう。

イメージとして、下記のようなレコードを5つ追加する必要があるかと思います。

キー(名前) タイプ 値(数値)
xxxxxxxxxxxxxxxxxxxxxxxxx._domainkey.example.com CNAME xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx._domainkey.example.com CNAME xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx._domainkey.example.com CNAME xxxxxxxxxxxxxxxxxxxxxxxxx
yyy.example.com MX 10 feedback-smtp.us-east-1.amazonses.com
yyy.example.com TXT v=spf1 include:amazonses.com ~all

※「yyy」はSESでID登録時に「カスタムMAIL FROMドメイン」設定時に入力した文字列です。

STEP4: SES側でステータス確認(3箇所)

正常にDNSにレコードが登録できれば1~10分ほどでSES側のステータスがすべて「検証済み」又は「成功」に更新されるはずです。

STEP5: テスト用メールアドレスの登録(サンドボックス状態の場合のみ)

※この手順はサンドボックス状態を既に解除している方は対応不要です。

サンドボックス状態を解除していない場合は、STEP6のメール送信(テスト)を行うためのテスト用メールアドレスをSESに登録しましょう。

サンドボックス状態の場合、SESに登録したメールアドレス/ドメイン以外にメールを送信することができません。(逆に言えば、特定のメールアドレスだけにメールを送信するのであれば、サンドボックスを解除する必要もなかったりします。)

手順は簡単で、テストで使用するメールアドレスをSESに登録し、送られてきた認証メールをクリックするだけでOKです。

STEP6: メール送信(テスト)

ここまで設定が完了すれば既にメールが送信できる状態になっているため、テストメールを送信してみましょう。

テストメールを送信する方法はいくつかありますが、今回は2パターンほどご紹介したいと思います。

ケース1: AWS CLIコマンドを使用してメール送信

1つ目の方法は、AWSのCLIコマンドを利用したメール送信方法です。

事前にAWS CLIをインストールしておく必要はありますが、AWS CLIのコマンドを使用し、メールを送信することができます。

aws ses send-email \
--from 送信元のメールアドレス(STEP2~3で登録したやつ) \
--to 送信先のメールアドレス(STEP5で登録したやつ)\
--subject '題名を入力' \
--text '本文を入力'\
--profile 実行するIAMユーザー名を指定

「–from」にはSTEP2~3で登録したドメインのメールアドレスを指定してください。例えば、example.comというドメインを登録した場合はinfo@example.comなどが指定可能です。「@」前に関しては基本どのような文字列でも指定可能ですので、好きな文字列を指定してください。

「–to」にはSTEP5で登録したテスト用のメールアドレスを指定してください。なお、サンドボックス解除済みの方はどのメールアドレスでも指定することが可能です。

「–subject」はメールのタイトル(見出し)部分に当たるものですので、好きなタイトルを入力してください。

「–text」はメールの本文に当たるものですので、こちらも好きな本文を入力してください。

「–profile」に関しては、SESというよりかはAWS CLIの仕様ですが、最低でもSESの送信権限ses:SendRawEmail OR ses:SendEmail)を持ったIAMユーザーを指定してください。

補足として「–profile」で指定するユーザーについて、ここでは詳しくは解説しませんが、下記のAWSコマンドで指定可能なprofileを確認できます。なお、確認コマンドを実行してもプロフィールが返ってこない場合は、次のコマンドでプロフィールを一から作成する必要があります。

# 指定可能なプロフィールを一覧で表示するコマンド
aws configure list-profiles

# プロフィールを一から作成するコマンド
aws configure --profile <profile name>
※<profile name>は好きなプロフィール名を指定してください。

ちなみに、今回当サイトで検証したSESコマンドは下記の通りです。

aws ses send-email \
--from info@dx.business \
--to xxx@gmail.com\
--subject 'テスト' \
--text 'あああ'\
--profile subaru

「–to」のxxx@gmail.comは伏せ字にしていますが、これで下記画像のようにメールを受信することができました。また、「–profile」のsubaruは管理者権限を持ったIAMユーザーが紐づけてあります。

ケース2: LambdaでSES APIを使用してメール送信

2つ目の方法は、LambdaでSES APIを利用したメール送信方法です。

早速ですが、今回テストメールの送信で使用するコードと基本情報は下記の通りです。(※本記事ではLambdaがどのようなサービスであるかについては既に知っている前提で進めていきます。)

  • 使用言語:Python
  • 使用バージョン:Python3.9
  • メモリ:128MB
  • タイムアウト:30秒
  • 環境変数:使用
import boto3
import os
import json

ADDR_TO = os.environ['MailRecipient']  # 送信先
ADDR_FROM = os.environ['MailSender']  # 送信元
SUBJECT = 'SESから送信しました。'  # 見出し(タイトル)
MESSAGE = '本文です。'  # 本文
REGION = 'us-east-1'  # リージョン指定


def send_email(source, addr_to, subject, body):
    client = boto3.client('ses', region_name=REGION)

    response = client.send_email(
        Source=source,
        Destination={
            'ToAddresses': [
                addr_to,
            ]
        },
        Message={
            'Subject': {
                'Data': subject,
            },
            'Body': {
                'Text': {
                    'Data': body,
                },
            }
        }
    )
    return response


def lambda_handler(event, context):
    r = send_email(ADDR_FROM, ADDR_TO, SUBJECT, MESSAGE)
    return r

リージョンについては、本記事ではバージニア北部を指定しているため「us-east-1」を設定していますが、その他のリージョンを選択された方は各リージョンの値を設定してください。

また、基本情報にも記載しましたが、上記のコードでは「送信先」や「送信元」を環境変数で管理しています。

コードをそのまま使用する場合は、下記画像の通りにLambdaに環境変数をセットすることを忘れないようにしてください。

最後に、LambdaにSESの実行権限を与えることも忘れないようにしてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SESDefaultAuth",
            "Effect": "Allow",
            "Action": [
                "ses:SendRawEmail",
                "ses:SendEmail"
            ],
            "Resource": "*"
        }
    ]
}

本番利用時にはResourceを絞った方が良いですが、今回はテストなので特に絞らなくてもOKです。

以上の設定をすべて反映後、デプロイし、Lambdaの「Test」を実行すればメールが送信先アドレスに届くはずです。

Lambdaで使用するコード一式はDX攻略部の公式Githubの方でも公開しています。

まとめ

本記事ではSESの設定方法について、少しでもわかりやすく、AWS初心者でもつまずくポイントがないように気を使いながら解説してみました。

SESは安価でありながら非常に使いやすく、Lambdaやその他のサービスとの連携もしやすいため、ぜひ様々な連携パターンを試してみてください。

また、今回ご紹介したSESの設定を行う上でのポイントをまとめると下記の通りです。

  1. メール受信が可能なリージョンは3つだけ!
  2. 本番利用前にはサンドボックス状態を解除する必要がある!
  3. SESで使うドメインはRoute53でホスト(DNS)管理するのが便利!

最後に、AWSには多くのサービスがありますが、今回ご紹介したSESのようにユースケースから実際のサービスに触れることでより実践的な知識や経験を得ることができます。

参考までに、私が過去に関わってきた開発の現場ではプログラムを書くエンジニアとしての能力よりも、客先のユースケースに合った最適なサービスやその組み合わせを提案できる営業よりの能力の方が評価されるといったケースは決して少なくありません。

むしろ、クラウド化が当たり前になった昨今では、今まで以上に営業よりの能力が重宝されるケースの方が増えてきているとさえ思います。

少し話は逸れましたが、今回ご紹介したSESもサービスを構成する上では欠かせないメールの送受信に直接関わってくるサービスであり、それだけユースケースも多種多様ですので、ぜひ様々な使い方をしてみることをおすすめします。

最後までお読みいただきありがとうございました。