SES with App Runner で TimeoutError
背景
App Runner が VPC に対応してからストレージへのスマートなアクセスが可能になりました。
VPCコネクターを PrivateSubnet 内に設定して RDS への接続に成功。
ついでに SES でメール送信もできるようにしておきたいということで早速 TimeoutError
で躓くわけです。
課題
App Runner の送信向けのネットワーキングで、PrivateSubnet を設定しているので、当然外部への経路がありません。
そのため、メール送信先に接続できずにタイムアウトとなります。
さて、ここで先人の知恵をお借りします。
ASP.NET Core + Amazon SES な Web システムを App Runner でホスティングし、ネットワークパターンごとにメール送信してみた
ふむふむ。
NatGatewayは料金的にもやや心配な面もあるのでVPCエンドポイントを設定してみます。
しかし、ここで新たな問題に直面します。
hostname: 'email.ap-northeast-1.amazonaws.com',
...
Error: connect ETIMEDOUT xxx.xxx.xxx.xxx:443
VPCエンドポイントは間違い無く正しく設定したはずなのですが、接続できません。
他にも原因があるようです。
解決
調査を進めていくと、VPCエンドポイントのプライベートDNS名に目が行きました。
!!!
あなたは気が付いたでしょうか。
エラーログのFQDNとプライベートDNS名が異なることに。
はい、ここでやっと答えが分かりました。
というわけで、VPCエンドポイントを使いたければSMTPエンドポイント(SMTP認証)を使ってメール送信しましょう。
或いは、APIエンドポイントを使いたければ、NatGateway を使いましょう。
追加解説
SES でメール送信する方法は2つあります。
- SMTPエンドポイントを利用して送信
- APIエンドポイントを利用して送信
SMTPエンドポイントを利用する場合、SMTP認証での送信になるのでIAMユーザーのアクセスキーが必要になります。
その反面、APIエンドポイントは利用するリソースにロールを設定すれば送信できるのでセキュリティ的には圧倒的に後者の方が良いのです。
流出したときのダメージが大きいので、アクセスキーの発行は可能な限り避けたいところですね。
一言
email-smtp.ap-northeast-1.amazonaws.com
と email.ap-northeast-1.amazonaws.com
の違いに気が付けたのは良い勉強になりました。
Discussion