Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

Amazon EC2上のPostfixからAmazon SESを経由してメールを送信する

はじめに

EC2からのメール送信をSESで簡単に実装する方法について記載してみます。
想定するのは、下図のようにEC2上のソフトウェア(たとえば監視とか)やスクリプト等がメールの送信元で、Postfixを経由してSESへメールリレーする構成になります。
構成図

前提

  • メール送信を対象に記載しています(受信は対象外)
  • ドメインは取得済み(今回はRoute53で取得済み)
  • EC2(OS含む)やPostfixはインストール・設定済み

手順

SES IDの作成

Amazon SES の ID の作成と検証を参考にIDの作成を行っていきます。

AWSマネジメントコンソール上でSESに遷移して画面左の設定からIDを選択します。
IDの作成ボタンが表示されるので、クリックします。
IDの作成-1

ドメイン箇所に検証対象(メール送信元ドメイン)のドメインを入力します。
DNSレコードのRoute53への発行箇所、今回はあえて手動で実施してみるためチェックしていませんが、Route53であれば次のDNSレコードの登録を自動で行えます。
IDの作成-2

Route53へ登録するCNAMEレコードは下図の箇所になります。
IDの作成-3

上記のCNAMEレコードをRoute53に作成します。下図のように3つのレコードをすべて作成します。
DNSレコード登録

しばらく待つとステータスが検証済みになります。私の場合は15分程で検証済みになりました。
IDの作成-4

SES SMTP認証情報の作成

AWSマネジメントコンソール上でSESに遷移して画面左のSMTP設定を選択し、SMTP 認証情報の作成をクリックします。
SMTP認証情報の作成-1

アクセス許可ポリシーは変更せず、ユーザー名のみ指定(今回はdev-ses-smtp-user)します。
SMTP認証情報の作成-2

後ほどPostfixで指定するため、認証情報を保存しておきます。
SMTP認証情報の作成-3

VPC ネットワーク設定の変更

EC2からSESへの疎通ができるよう、ネットワーク設定を変更しておきます。
環境によって必要な設定箇所が異なってくるのでここでは例のみとしますが、セキュリティグループのアウトバウンドルールを追加したり、要件によってはVPCエンドポイントを作成して、ルートテーブルを更新したり等になります。

EC2 Postfix設定

Postfix設定ファイル(/etc/postfix/main.cf)に以下、必要設定を追加します。

relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

以下、参考例になりますが、必要に応じてmyhostnamemydomain等も修正してください。

myhostname = <EC2のホスト名>.<IDの作成で登録した検証済みドメイン>
mydomain = <IDの作成で登録した検証済みドメイン>

次に、SESへの認証情報を保存するファイルを作成します。

# vi /etc/postfix/sasl_passwd

前述の「SMTP認証情報の作成」で取得した、SMTPユーザー名とSMTPパスワードを記載します。

[email-smtp.ap-northeast-1.amazonaws.com]:587 SMTPユーザー名:SMTPパスワード

パスワードファイルの権限変更、パスワードのハッシュ化、プロセスの再起動を行います。

# chmod 600 /etc/postfix/sasl_passwd
# postmap hash:/etc/postfix/sasl_passwd
# systemctl restart postfix

SES サンドボックス外への移動

SESの初期状態はサンドボックス内にあり、一定の制限が適用されています。そのため外部メールアドレス宛へのメール送信も制限がされているため、サンドボックス外への移動を行っていきます。
本番稼働用アクセスをリクエストする (Amazon SES サンドボックス外への移動)

AWSマネジメントコンソール上でSESに遷移して画面左の設定を始めるを選択して、右側の本稼働アクセスのリクエストをクリックします。
サンドボックス外への移動-1

リクエストの申請画面に遷移するため必要事項を記入して、リクエストの送信をクリックします。
サンドボックス外への移動-2

承認されると以下のような、メールが届きます。申請から1分と立たず承認されました。
サンドボックス外への移動-3

メール送信確認

最後にEC2からメール送信を確認します。-rオプションでFromをIDの作成で登録した検証済みドメインを指定します。

# echo "mail body" | mail -r test@<IDの作成で登録した検証済みドメイン> -s "mail subject" <宛先メールアドレス>

メールログを確認して送信できたか確認します。

  • リレー先がSES(relay=email-smtp.ap-northeast-1.amazonaws.comの部分)
  • 送信ステータスがOKか(status=sent 250 Okの部分)
# tail /var/log/maillog
Apr 25 08:58:56 ホスト名 postfix/smtp[20115]: BC11543E67: to=<宛先メールアドレス>, relay=email-smtp.ap-northeast-1.amazonaws.com[13.114.114.157]:587, delay=0.3, delays=0.02/0.07/0.05/0.16, dsn=2.0.0, status=sent (250 Ok 0106018f128c4da8-da79553b-1a45-4315-9539-694873d1c5ab-000000)

宛先メールアドレス側(今回はGmail)で受信したメールヘッダーを確認します。SPF/DKIMもきちんとPASSになっています。
メール確認

メールIDにもap-northeast-1.amazonses.comが含まれていますが、IPを逆引きすると以下のようにSESから送信されていることがわかります。

$ nslookup 23.251.234.8
名前:    e234-8.smtp-out.ap-northeast-1.amazonses.com
Address:  23.251.234.8

おわりに

今回はSESからメール送信をする方法を記載しましたが、EC2上のPostfixから直接メール送信する方法については、過去記事をご参照ください。
EC2サーバのPostfixから外部の宛先にメール送信するまで ①
EC2サーバのPostfixから外部の宛先にメール送信するまで ②