目次
はじめに
AWSにまだ慣れてない人から「プライベートサブネット上にあるEC2インスタンスからメールを送信したいのだけど、どうすればいい?」という質問を何度か受けているので、これを機にまとめてみようと思います。
軽くSESの復習
SESはAWSが提供するメール送受信サービスです。AWS上に構築したシステムからメールを送信したいケースは沢山あると思うのですが、そのようなケースで真っ先に検討すべきはSESの利用です。
SESを使えば、自分でメールサーバを構築しなくてもメール送受信ができるようになります。料金は従量課金です。毎月62,000通の送信と、1,
SESは設定すればすぐに使えるようになるのですが、注意すべき点を一つ上げるとすれば、初期設定でメール送信に一定の制限がかかっているという点です。これはAWS環境からスパムや悪質なメールを送信させないようにするためです。「AWS SES サンドボックス 解除」で検索すれば親切に説明してくださってるサイト様がたくさん見つかりますので、そちらを参考にしてください。(他力本願!)
プライベートサブネットからのメール送信
さて、本題の「プライベートサブネット上にあるEC2インスタンスからメールを送信したいのだけど、どうすればいい?」なのですが、その前に「パブリックサブネット上にあるEC2インスタンスからメールを送信する」時の図を見てください。
「あれ、メール送信するのに一度インターネットに出てる?」と気付いた方。そうなんです。この構成だと一旦AWS外に出て、インターネットを経由して、またAWSに戻ってくるのです。なので、プライベートサブネットにあるEC2インスタンスからSESを使ってメールを送信しようとしても送信できません。
このようなケースでは、VPCエンドポイントを使いましょう。VPCエンドポイントは、特定のサービス(今回の場合はSES)に直結するトンネルを設置するイメージです。図にするとこうなります。
VPCエンドポイントは、今回のように「インターネットに出られない環境からAWSの特定のサービスと通信したい」時や「セキュリティポリシー的に、通信をインターネット経由にしたくない」という時に使うサービスです。SESだけでなく、色々なサービスのエンドポイントが提供されていますので、是非覚えておきましょう。
VPCエンドポイントじゃなくて、NATゲートウェイを使ってもいいよね?と思った方。はい。もちろんです。どちらを選ぶかは、機能やセキュリティ的な理由、料金等を総合的に判断して選べばいいと思います。
VPCエンドポイントを作ってみよう
さて、それでは実際にVPCエンドポイントを作成してみましょう。AWSマネジメントコンソールにログインして、VPC→エンドポイント→エンドポイントの作成をクリックします。
サービスカテゴリで「AWSサービス」を選択し、サービス名の中からSESを選択します。しかしSESで検索しても出てこないので、「email」で検索して、「com.amazonaws.ap-northeast-1.email-smtp」を選択しましょう。
あとはVPCエンドポイントを設置するVPCとサブネットを選択します。サブネットは複数指定可能ですが、1AZあたり1つのサブネットしか指定できないので注意してください。(余談ですが、「同じAZの複数のプライベートサブネットからメールを送信したいけど、サブネット間の通信は許可していないんです!」という場合は、VCPエンドポイントを複数作成すれば、同じAZの中に複数のVPCエンドポイントできます。)以下はAZ-A、AZ-C、AZ-DのそれぞれにVPCエンドポイントを設置する例です。
その次にある設定項目「Enable DNS name」は、この後説明しますが、1つのVPCの中に他にSES用のVPCエンドポイントがなく、今後増える予定がないのであれば、チェックを入れたままにしておけば良いと思います。
あとはセキュリティグループやタグを設定し、「エンドポイントの作成」を押せば、SES用のVPCエンドポイントが作成されます。利用可能になるまで少し時間がかかるので待ちましょう。
Enable DNS nameの設定は何のため?
「Enable DNS」にチェックを入れてVPCエンドポイントを作成すると、SESのエンドポイント名でVPCエンドポイントにアクセスできるようになります。例えばすでに東京リージョンのSESを使っている場合、SMTPエンドポイント「 email-smtp.ap-northeast-1.amazonaws.com 」にメールを送信するよ、という設定がシステムのどこかにあるはずですが、この「 email-smtp.ap-northeast-1.amazonaws.com 」という名前をVPCエンドポイントに付け替えてしまうイメージです。何のメリットがあるかというと、VPCエンドポイントを有効にした後のシステム側の設定変更が不要になります。システムはずっと同じ相手に「これを転送してね、よろしく!」とメールを送り続けているつもりなのですが、途中から相手がSMTPエンドポイントからVPCエンドポイントに切り替わっている、そんなイメージです。もちろん、この挙動がありがたい時もあれば、まったくもって不要だという時もあるので、有効にするかどうかは都度判断してください。ちなみに、1つのVPCの中に同種類のVPCエンドポイントを作成する場合、2個目のVPCエンドポイントでも「Enable DNS」を有効にしようとすると「private-dns-enabled cannot be set because there is already a conflicting DNS domain for email-smtp.ap-northeast-1.amazonaws.com in the VPC vpc-********(もうその名前は使っているよ!)」というエラーになるのでご注意を。
君(VPCエンドポイント)の名は
Enable DNS関連の話が続くのですが、もしEnable DNSをオフにしてVPCエンドポイントを作った場合、どのようなDNS名でアクセスすればいいのでしょう?
先程作成した3つのAZで有効なVPCエンドポイントで詳細を確認しましょう。作成したVPCエンドポイントの「詳細」タブを選択すると右側に表示されています。
おっと、沢山ありますね。順に見ていきましょう。DNS名の中に vpce- から始まるものが4つありますね。
最初の1つは、リージョン単位のVPCエンドポイント名を指すDNS名です。nslookup結果はこうなります。
残りの3つはそれぞれのAZのVPCエンドポイントです。確認するとこうなります。よく見ればDNS名に「ap-northeast-1a」、「ap-northeast-1c」、「ap-northeast-1d」とあるので、どのAZにあるものかがわかるようになっていますね。
ということで、これらのDNS名はケースバイケースで使い分けしましょう。1つのAZで障害が発生した時に無事なAZにあるVPCエンドポイント経由でメールを送信したい場合は、一番上にあるリージョン単位のVPCエンドポイントを使い、送り先を固定したい場合は2番目以降のDNS名使えばいいでしょう。
VPCエンドポイントの料金について
さてさて、最後に料金の話もしておきたいと思います。
今更ですがVPCエンドポイントにはゲートウェイ型とPrivateLink型があり、SESのVPCエンドポイントは PrivateLink型となっています。なぜこのような話をするかというと、料金体系が違うからです。ゲートウェイ型は設定してあるだけなら追加料金なしですが、PrivateLink型は設定してあると時間単位で料金が発生します。また、処理データ量によっても料金がかかります。(どちらもデータ転送量は別途発生します。)同じ「VPCゲートウェイ」でもこのような違いがあるので、ご注意ください。
じゃあPrivateLink型のVPCエンドポイントはどれくらいの料金がかかるの?というと、東京リージョンの場合は以下の通りです。(2021年3月時点)
●各 AZ の VPC エンドポイント 1 つあたりの料金 (USD/時間):0.014USD
●処理データ 1 GB あたりの料金 (USD):0.01USD
「各AZの」というのがミソです。例えば、1つのAZにVPCエンドポイントを作った時の1か月の料金を計算すると、0.014USD/時間 * 24時間 * 30日 ≒ 10.08USD ということで、為替レートにもよりますが、1,000円ちょっとになる計算です。もし2つのAZにVPCエンドポイントを作成したら、料金は倍の2,000円ちょっとになります。先ほど作ってみようと言って作ったSES用のVPCエンドポイントは3つのAZで動くものでしたので、1か月そのままにしていたら3,000円かかる計算です。結構高くないですか?
不要な料金がかかっていることに気付かず、あとからガッカリすることがないよう、ご注意ください。
おわりに
というわけで、プライベートサブネットからメールを送信する場合の説明でした!参考になれば幸いです。
執筆者プロフィール
- 開発プロジェクトの技術支援や技術の検証に従事しているインフラエンジニアです。Unix/Linuxを扱う機会が多く、構築から運用保守まで一通り携わった経験があります。好きな言葉は「試験運用」。
この執筆者の最新記事
- Pick UP!2022.03.15AWSのプライベートサブネットからSES経由でメールを送信する
- Pick UP!2020.10.19AWS認定試験の専門知識(セキュリティ・高度なネットワーキング)に合格する方法
- Pick UP!2020.03.23AWS認定試験を6冠するための受験順と勉強法
- AWS・クラウド2019.10.23AWS 認定ソリューションアーキテクト – プロフェッショナルの新試験に合格した話