まめ畑

ゆるゆると書いていきます

VPC内のインスタンスからメールを送る

AWSには、SESというメールを簡単に送信出来るサービスがありますが、ケータイキャリア向けに最適化して送りたいとか、送信前に色々やりたい、送信したメールの情報を取っておきたいなどなどで、自前のメールサーバからメールを送信したいという要望はあると思います。

suz-lab - blog: Postfixでリレー設定(冗長構成)
の記事で、Postfixのrelayhostとfallback_relayを使用した冗長構成が紹介されていましたので、今回は、Internal ELBを使った構成とAWS内の自前のメールサーバからメールを送信する際の注意点についてまとめておきます。


まず、Internal ELBを使った場合の利点ですが、メンテナンスの容易性と可用性があります。
アプリケーションサーバやバッチサーバなどのメール送信元に設定するメールサーバの接続先情報は、Internal ELBのドメインだけでよいので、キャパシティ増強のためにメールサーバを増設・メンテナンスのために1台外すなどが設定の変更なしに行うことが出来ます。
また、複数のAZにメールサーバを簡単に配置することが出来るため、可用性の向上も簡単に出来ます。
監視については、自作スクリプトでメールの送信状況を監視するのでもいいと思いますが、簡単に行うのであれば、TCP:25の疎通チェックで間隔を短く設定しておくのでもいいかと思います。


モバイルキャリアへのメールを別のメールサーバに転送して流量調整や特定接続のサーバに転送する場合の構成例です
f:id:con_mame:20130315102138p:plain
PostfixがインストールされたMXサーバ1台につき1つElastic IPを付与します。
転送先もInternal ELBでまとめてあります。


この場合のPostfixの転送設定は(docomo.ne.jpだけを特別扱いする場合)

docomo.ne.jp    :[internal-hogemx-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com]:2500

の様な感じでtransportファイルに記述します。
もちろんmain.cfに

mynetworks      = 10.0.0.0/16

の様に使用しているVPCサブネットの情報を記述しておきます。

ここで、なぜ転送先のポート番号が25でない値を設定しているかですが

status=bounced (mail for internal-hogemx-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com loops back to myself)

この様なエラーが出ないようにするためです。
これは、Internal ELBのドメインが転送元MXサーバのmydestinationに設定されていないために出るのですが、このエラーがでるのは25番ポートを指定した時だけなので、今回はInternal ELBで2500->25というようにポート番号の変換を行なっています。

AWS内からメールを送る場合いの注意

自前のメールサーバからメールを送る場合

  1. DNSの逆引き設定を行なってもらう
  2. メールの送信数制限を解除してもらう
  3. SPFレコードの登録

が必要です。特に最初の2つが大事です。
AWS内の自前サーバからメールを送信する場合、AWS側で送信すうの制限がかかっています。また、EC2 Instanceの逆引き設定を行わないと、ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com. のようなドメインに解決されてしまうため、送信先によってはSPAM扱いされてしまいます。

DNSの逆引きとメール送信数の制限解除申請は
Request to Remove Email Sending Limitations
から行えます。

SPFレコードの設定はDNSのTXTレコードに、メールサーバに付与してEIPを

v=spf1 +ip4:xxx.xxx.xxx.xxx +ip4:xxx.xxx.xxx.xxx ~all

のように記述します。


SESを使ったほうがシンプルな構成になりますが、特にケータイキャリア向けメールの送信を自前で行う場合などSESを使えない場面ではこのような構成はいかがでしょうか。