はじめに
AWSのFargateで動かしているコンテナ内で、AWS SDKを利用してAmazon SES経由でEメールを送信する仕組みを構築しました。
公式ドキュメントを参考にVPCエンドポイントを設定したにもかかわらず、SES経由のメール送信ができない問題に遭遇したので、その原因と解決策について書き留めておきます。
結論
Fargate上のコンテナからAWS SDKを使ったSES経由のメール送信を行う場合、SMTP対応のVPCエンドポイントではなく、NAT Gatewayを用いた通信経路が必要でした。
通信ができなかった構成構成
通信ができた構成
構成概要
• ECS(Fargate)でコンテナを稼働
• コンテナはプライベートサブネット内に配置
• AWS SDKを使用してAmazon SES経由でEメールを送信
起きた問題
ドキュメントを参考に設定したVPCエンドポイントがうまく機能しませんでした。具体的には、SESのSMTPエンドポイントに対しての接続はVPCエンドポイント経由で提供されていますが、AWS SDK(API経由の送信)はSMTPではなくSESのHTTPSエンドポイントを利用するため、設定したVPCエンドポイントでは対応で着なかったようです。
問題の原因詳細
AWS SESには次の2つの送信方法があります。
• SMTPインターフェース(メールクライアントなど)
• HTTPSインターフェース(AWS SDK、AWS CLI経由)
VPCエンドポイント(interface型)はSMTP通信にのみ対応しており、AWS SDKが使用するHTTPS通信には対応していないため、プライベートサブネット内のコンテナからはSES APIへアクセスができませんでした。
解決方法
VPCエンドポイント経由での通信を諦め、代わりにNAT Gatewayを経由して外部インターネットへの通信を許可することで、この問題を解決しました。
具体的な解決手順は以下の通りです。
1. NAT Gatewayをパブリックサブネットに設置
2. プライベートサブネットのルートテーブルを編集し、インターネット向け通信をNAT Gatewayにルーティング
3. AWS SDKからSESへの通信が可能になり、正常にメール送信が行えるようになった
まとめ
Fargate上のコンテナからAWS SDKを使ったSES経由のメール送信を行う場合、SMTP対応のVPCエンドポイントではなく、NAT Gatewayを用いた通信経路が必要でした。
同じような問題で困っている方の助けになれば幸いです。