インターネットとVPC内部から同一FQDNでアクセス可能な構成
AWSでALBを使う場合に、Security Groupでインターネットからアクセス可能なIPアドレスを制限しながら、VPC内部から同じFQDNでサービスにアクセスできるようにしたい。
TL;DR
Requirements:
- インターネットから
https://api.example.com
でサービスにアクセスできること - EC2から
https://api.example.com
でサービスにアクセスできること - インターネット側はSecurity Groupでアクセスを制限する
Solution:
Internet ↓ Route53 Public Hosted Zone ↓ Internet Gateway ↓ Security Group (internet-facing) ↓ ALB (internet-facing) ↓ EC2
VPC ENI ↓ Route53 Private Hosted Zone ↓ Security Group (internal) ↓ ALB (internal) ↓ EC2
VPC内部からALBへの通信
EC2からinternet-facing ALBにリクエストを送ると、EC2に紐付いたPublic IPアドレスが送信元になります。ALBにアクセス可能なIPアドレスを制限する場合、内側からアクセス可能にするにはEC2のPublic IPアドレスも追加する必要があります。もちろん、EC2同士がPrivate IPアドレスで通信すれば問題ないのですが、Auto Scaling Groupを利用している場合はIPアドレスが変わってしまうため困難です。
EC2 ↓ Security Group ↓ ALB (internet-facing) ↓ Auto Scaling Group ↓ EC2
下記のような場合、VPCの内側からALBへの通信が必要になります。
- 開発ツールの設定にGitリポジトリのURLを書いており、外側からも内側からも同じURLでGitリポジトリにアクセスしたい。
- OAuth2やOpenID Connectを使っており、ブラウザから見えるURLと同じFQDNで authorization code を取得できる必要がある。
- VPC LambdaからALBにアクセスしたい。
もともとは内製のツールでAuto Scaling Group配下のEIPを固定し、Security GroupにEIPを入れる方式を採用していましたが、 id:mumoshu さんに別の解決法があるよと教えていただきました。
Private Hosted Zoneとinternal ALBによる解決法
VPC内部からALBへの通信を実現するため、別のルートを作る方法があります。具体的には、VPCの内側からサービスにアクセスするためのinternal ALBと、internal ALBを返すPrivate Hosted Zoneを作成します。
EC2 ↓ Route53 Private Hosted Zone ↓ Security Group ↓ ALB (internal) ↓ Auto Scaling Group ↓ EC2
例えば、IPアドレス制限付きで https://api.example.com
で公開しているサービスがあるとします。
VPCの内側から同じURLでサービスにアクセスできるようにするには下記を行います。
- internal ALBを作成します。この時、EC2のSecurity Groupをソースに設定し、EC2からALBへの通信を許可しておきます。
- Route53で
example.com
のPrivate Hosted Zoneを作成します。 - Aレコードを作成して
api.example.com
をinternal ALBに割り当てます。
最終的な構成を下図に示します。
まとめ
Inbound Ruleに設定するソースをPublic IPじゃなくてSGにする、じゃダメな感じですか?(インスタンスからALBへの通信がインターネット経由の通信になるからPublic IPじゃないとだめとか?
— Yusuke KUOKA (@mumoshu) 2017年12月20日
あら!ちなみに、ALBをinternet-facingではなく、internalにしたらいけると思うのですが、それもダメな感じですか?(ALBはいじっちゃいけない、とかなければ
— Yusuke KUOKA (@mumoshu) 2017年12月20日
できないです!でもその場合、インターネットからアクセスする用と、VPC内からアクセスする用のALBを分けたくなります。Hosted ZoneもそれぞれPublicとPrivateで分けて。
— Yusuke KUOKA (@mumoshu) 2017年12月20日
はい、そうです!
— Yusuke KUOKA (@mumoshu) 2017年12月20日