VMware Cloud on AWSからAmazon SESを経由してメールを送信してみた

こんにちは、AWS事業本部の荒平(@0Air)です。

VMware Cloud on AWSからAmazon SESを経由してメールを送りたい、そんな季節もあると思います。

今回は、VMware Cloud on AWSからPostfixを利用して、Amazon SESをリレーサーバとして指定し、メールを送信してみました。

構成図

本エントリの構成図です。
VMware Cloud on AWSの仮想マシン(Ubuntu)にPostfixを導入し、Amazon SESへSMTP認証を利用してメールをリレーします。

やってみた

1. Amazon SESをセットアップする

Amazon SESのセットアップを行い、Eメール認証・ドメイン認証・本番利用申請を実施します。
このあたりは環境によって操作内容が変わる他、公式からチュートリアルが出ているため割愛します。

本稼働アクセスリクエストを実施しました。
サンドボックス→本番アクセスへ移行しない場合は、機能的に多く制限されます。

「本番アクセスが許可されました」のステータスになっていると、あらゆる宛先へのメール送信が可能です。

2. SMTP認証設定

以下の記事を参考に、SMTPインターフェイスの設定を行います。
(少々インターフェイスが更新されているので、本記事で補足します)

「SMTP認証情報の作成」をクリックします。

IAMユーザー作成画面が開きます。 ユーザー名は日時から自動で入力されますので、適宜変更して「ユーザーの作成」をクリックします。

作成された認証情報が生成されるます。送信のために利用するため、控えておきます。

3. メール送信準備(Ubuntu/postfix)

検証のため、UbuntuからSMTP認証でメールを送信する準備手順です。
各クライアントから、「email-smtp.ap-northeast-1.amazonaws.com:port」(利用リージョンによって異なる)へのリクエストを送れるようにします。

今回はpostfixを利用するため、以下のコマンドを投入しました。

sudo apt update
sudo apt install mailutils
sudo apt install postfix

Postfixインストール時に設定が求められるので、Internet Siteを選択します。

System mail nameは、システムのメール名(FQDN)を入力し、「OK」をクリックします。

続いて、Postfixの詳細設定を行います。

sudo vim /etc/postfix/main.cf

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

以下のようなイメージです。

Amazon SESにて生成したSMTP認証情報(ユーザー名・パスワード)を設定します。

sudo vim /etc/postfix/sasl_passwd

ユーザー名(USERNAME)・パスワード(PASSWORD)は先程発行したユーザーのものに置き換えます。

[email-smtp.ap-northeast-1.amazonaws.com]:587 USERNAME:PASSWORD

認証情報ファイルへのアクセス権限を制限して、再起動します。

sudo chmod 640 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd

sudo systemctl restart postfix

4. VMware Cloud on AWS側の設定

VMware Cloud on AWSのNSXでは、仮想マシンからインターネット向けのFirewallを許可します。

ポート番号は利用するポートによって異なります。(今回の場合、587)
587番ポートはデフォルトのリストに存在しないので、手動でAmazon SES用のエントリを追加しました。
※ 任意のインターネット向けアウトバウンドが許可されている場合は、不要です

仮想マシン→インターネット向けに、Amazon SES(ポート:587)を設定してみました。

5. メール送信

SESを経由してpostfixからメールを送信してみます。

echo "Test email from Postfix" | mail -s "Test Postfix" -r ses@from-mail-address.classmethod.jp destination@classmethod.jp

無事にメールがデリバリーされました!

おわりに

Postfixを扱うのが初めてだったので、かなり手間取りました。
備忘的に、検証時に出ていたエラーを2つ紹介します。

遭遇したエラーメッセージ1:

(SASL authentication failed; server email-smtp.ap-northeast-1.amazonaws.com[xx.xx.xx.xx] said: 535 Authentication Credentials Invalid)

/etc/postfix/sasl_passwd の認証情報が間違っている場合に出ていました。また、変更後は再度sudo postmap /etc/postfix/sasl_passwdにてDBの更新が必要でした。

遭遇したエラーメッセージ2:

Diagnostic-Code: smtp; 554 Message rejected: Email address is not verified. The
    following identities failed the check in region AP-NORTHEAST-1: root

送信元メールアドレスが指定されていない/SES側で検証登録されていない場合に出ていました。
記事中のコマンドにて-r オプションを指定すれば解決しました。

このエントリが誰かの助けになれば幸いです。

それでは、AWS事業本部 コンサルティング部の荒平(@0Air)がお送りしました!

参考