[アップデート] Amazon SES が SMTP エンドポイントの VPC エンドポイントをサポートしました

VPC エンドポイントを介して、Amazon SES の SMTP エンドポイントに接続できるアップデートが発表されました。試してみます。
2020.05.05

こんにちは、岩城です。

数日前、VPC エンドポイントを介して、Amazon SES(以降、SES)の SMTP エンドポイントに接続できるアップデートが発表されました。

Amazon SES now offers VPC Endpoint support for SMTP Endpoints

SES が利用できる以下の全リージョンで利用可能です。SES が利用できない東京リージョンでは VPC エンドポイントを作成できないので注意してください。

  • 対象リージョン
  • 米国東部(バージニア北部)
  • 米国西部 (オレゴン)
  • アジアパシフィック (ムンバイ)
  • アジアパシフィック (シドニー)
  • カナダ (中部)
  • 欧州 (フランクフルト)
  • 欧州 (アイルランド)
  • 欧州 (ロンドン)
  • 南米 (サンパウロ)

何ができるようになったの?

SES を介して E メールを送信する方法は以下の 2 つです。

  • SMTP インターフェースを使用する
  • SES API を使用する

SMTP インターフェースを利用する際、SMTP エンドポイントにアクセスします。

これまでは、VPC から SMTP エンドポイントにアクセスする際、Internet Gateway や Nat gateway 介してインターネットを経由してアクセスする必要がありました。

今回のアップデートにより、VPC エンドポイントを介して SMTP エンドポイントにアクセスできるようになったので、プライベートにアクセスできるようになりました。

構成図で表すと以下のような感じです。

直接 Internet Gateway を経由して SMTP エンドポイントにアクセスするパターン

NAT Gateway → Internet Gateway を経由して SMTP エンドポイントにアクセスするパターン

(NEW)VPC エンドポイントを経由して SMTP エンドポイントにアクセスするパターン

試してみる

まずはリージョンをオレゴンにしてコンソールから確認してみます。

VPC エンドポイント作成時に com.amazonaws.us-west-2.email-smtp を選択できるようになっていました。

VPC エンドポイントには、必要に応じて以下のようなセキュリティグループを設定する必要があります。

  • ソースに VPC エンドポイントにアクセスする EC2 インスタンスのプライベート IP
  • ポートにメールの送信に使用するポート番号を入力
  • 次のポート番号のいずれかを使用する
  • 25、465、 587、2465、または 2587

次に以下のような環境を作成して動作確認をしてみます。本エントリの最後に Terraform のコードを載せておくので詳細な作成手順は省きます。

今回の構成は、Internet Gateway を作成せず、分かりやすいように完全なプライベートネットワークにしました。

検証のため EC2 インスタンスからコマンドを実行する必要がありますが、EC2 インスタンスへはマネジメントコンソールから SSM Session Manager を利用してアクセスします。

検証に利用するコマンドは、以下のドキュメントに記載されているものをそのまま利用します。

コマンドラインを使用して Amazon SES SMTP インターフェイスへの接続をテストする

接続テスト成功のケース

接続が成功しました。接続に失敗する場合は、VPC エンドポイントに設定するセキュリティグループに間違いがないか確認してください。

$ openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
depth=4 C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
verify return:1
depth=3 C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
verify return:1
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = email-smtp.us-west-2.amazonaws.com
verify return:1
250 Ok
451 4.4.2 Timeout waiting for data from client.

接続テスト失敗のケース

VPC エンドポイントのセキュリティグループが間違っていたり、そもそも VPC エンドポイントがないと以下のように接続が失敗します。

$ openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
socket: Bad file descriptor
connect:errno=9

おわりに

検証方法を考えている際、メール送信するプログラムを書かないとだめかー、なんて考えていましたが接続テスト用のコマンドがあって嬉しかったです。これまで SES を触ることがなかったので良い勉強になりました。

本エントリがどなたかのお役に立てれば幸いです。

おまけ(Terraform のコード)