@int128

int128.hatenablog.com

VPC内部からALBにアクセスする場合の設計

AWSでALBを使う場合に、インターネット側のIPアドレスを制限しながら、VPC内部から同じFQDNでサービスにアクセスできるようにしたい。

TL;DR

Requirement:

  • インターネットから https://api.example.com でサービスにアクセスできること
  • EC2から https://api.example.com でサービスにアクセスできること
  • インターネット側はSecurity Groupでアクセスを制限する

Solution:

Internet → Route53 Public Hosted Zone → Security Group → internet-facing ALB → EC2

EC2 → VPC → Route53 Private Hosted Zone → Security Group → internal ALB → 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に割り当てます。

最終的な構成を下図に示します。

f:id:int128:20171225125725p:plain

まとめ