Amazon VPC のサブネットと通信関係を図にしてみた
序章
Amazon Virtual Private Cloud (VPC) におけるネットワークでは、アベイラビリティゾーン(AZ)やルートテーブルの関係性がかなり重要になる要素なので自己学習のためにまとめました。
EC2 や RDS、VPC Lambda、接続元を固定 IP アドレス化するときに何かとサブネットや NAT ゲートウェイが絡むので、これを中心に書きます。
本番運用で良く構成されるであろう、障害耐性を考慮したマルチ AZ 構成で理解を深めます。
この記事で扱わないこと
「セキュリティグループ」については扱いません。
最終的に接続相手のサーバー等へのアクセスにはセキュリティグループによるプロトコル・ポート番号を含めた許可が必要ですが、よしなに許可できている前提とします。最後に判断基準として少しだけ書きました。
この記事ではポート番号等による制限の外側、IP アドレスレベルでの領域を扱います。
全体像とインターネット通信
AWS のネットワークやリソースの境界をざっくりまとめました。リージョンとアベイラビリティゾーン、VPC の関係はこんな感じです。

VPC ではインターネットとどの経路で通信できるか・出来ないかによって 3 種類のサブネットに大別できます。
サブネットの特徴
サブネットに関連付けるルートテーブル(上図の左右にある大きな矢印内)の設定により決まります。
パブリックサブネット
グローバル IP アドレスを割り当てれることが最大の特徴で、グローバル IP アドレスを割り当てると、インターネットへの接続・インターネットからの接続を受付できます。
割り当て方法は「サブネット設定による動的割り当て」と「Elastic IP で事前確保した固定 IP アドレスの手動割り当て」とあります。
プライベートサブネット
ルートテーブルの設定により、パブリックサブネット内に配置した NAT ゲートウェイを経由することでインターネットへ接続できるネットワークです。
POINT: インターネットからプライベートサブネットへは接続できません。
アイソレートサブネット
同じ VPC 内のリソース同士でしか通信できないネットワークです。
プライベートサブネットにはないポテンシャルは、インターネットへのアクセスが出来ないこと。このサブネット内にある EC2 等からは直接 VPC 外にデータ送信(漏洩)しないという観点でプライベートサブネットよりセキュアといえます。RDS で採用例が多いです。
EC2 で採用する場合は OS セキュリティパッチ当てやサービスウェアのアップデート方法を含めた保守戦略を一緒に検討することが重要になります。
IP アドレスの割り当て
どのサブネットも該当サブネットで指定しているネットワーク範囲からプライベート IP アドレスを割り当てます。通常は DHCP による自動割り当てを行います。
パブリックサブネットに配置する EC2 は「プライベート IP アドレス」と「グローバル IP アドレス」の 2 個のアドレスが割り当てられている事になる。
グローバル IP アドレスは自動割り当てするか、Elastic IP で固定 IP アドレスを確保して割り当てることができます。
コラム:パブリックサブネットの VPC Lambda
Lambda には VPC 内のリソース(データベースなど)にアクセスできる設定があります。設定時にサブネットを指定できるのですが、パブリックサブネットを指定したとしてもグローバル IP アドレスを割り当てる事はできません。
プライベート IP アドレスしかないので、インターネット上にある API 等にはアクセスできません。インターネットアクセスが必要な場合はプライベートサブネットを指定して NAT ゲートウェイ経由にする必要があります。
ルートテーブル
宛先 IP アドレスの範囲ごとに次の経由地点を示した一覧がルートテーブルです。
デフォルトルート
宛先が 0.0.0.0/0 となるものがデフォルトルートです。
他の宛先範囲に含まれない場合にこのルートが使われます。この設定がなく、他に合致したルートが無いと宛先不明となりデータは送信されません。
プライベートからのパケット道のり
図式にすると簡単ですが参照するルートテーブルが複数あり、行きと帰りで見る部分が違うのでパケットの流れを細かく書きます。プライベートサブネット内にある EC2 や VPC Lambda の経由は以下のようになります。
例として、プライベートサブネット(10.0.3.0/24)に属する EC2 ec2-private-1a とします。
- 
ec2-private-1aのプライベート IP アドレスと10.0.3.9とします。
- 
nat-a1のグローバル IP アドレスを22.5.6.7とします。
- 外部のサーバーを 99.86.197.169とします。
 ec2-private-1a がインターネットアクセスするとき
- 
ec2-private-1a(送信元:10.0.3.9、宛先:99.86.197.169)
 ↓
 <ルートテーブル②を見て、宛先が0.0.0.0/0に該当。記載のnat-1aに転送する>
 ↓
- 
nat-1a※送信元が nat-1a のグローバル IP22.5.6.7に変換される
 ↓
 <ルートテーブル①を見て、宛先が0.0.0.0/0に該当。記載のigwに転送する>
 ↓
- 
igwインターネットゲートウェイ
 ↓
- インターネット
 ↓
- 外部のサーバー 99.86.197.169に到着
 送信元は22.5.6.7と見えている。
※NAT ゲートウェイによるアドレス変換
この時に nat-1a に割り当てた Elastic IP アドレスが送信元に変換され、アドレス変換結果を応答パケット処理用に一定時間記憶されます。
応答パケット
- 外部のサーバー(送信元: 99.86.197.169、宛先:22.5.6.7)
 ↓
- インターネット
 ↓
- 
igw
 ↓
- 
nat-1a※宛先をec2-private-1aのプライベート IP10.0.3.9に変換
 ↓
 <ルートテーブル①を見て、宛先が10.0.0.0/16に該当。同一ネットワーク内と判断>
 ↓
- 
ec2-private-1aに応答パケットが到達する。
※送信時のアドレス変換結果をもとにして戻す。
VPC 内の通信
VPC 内にある EC2 同士や RDS へのアクセスはルートテーブルで宛先が local =ローカルネットワークになっている範囲が、直通でデータ送受信きるアドレスの範囲になります。

図示しているルートテーブルの設定ではどのサブネットでも、接続先の IP アドレス範囲が「10.0.0.0/16」であればローカルネットワーク扱いにしています。VPC と同じ範囲なのでサブネットによらず VPC 内であればアクセス可能という設定になります。
前述した応答パケット処理時のルートテーブルの見かたがコレに当たります。
VPC 設定のポイント
- インターネットからのアクセスを受け付ける・インターネットアクセスが必要、不要までを VPC とサブネット+ルートテーブルで制御する。
- リソース間の接続制御(ある EC2 や VPC Lambda からのみ RDS に繋げられる等)はセキュリティグループで行う。
と責務を分けて考えるのが良さそうです。
何かの参考になれば幸いです。






Discussion