勘違いしていたこと
AWSをふわりとした理解だけで触っていた頃、VPC内のサブネットごとに独立したルーターが存在し、それぞれのルーターにルーティングテーブルが紐づいていると思っていたことがありました。
サブネットAとサブネットBがある場合、それぞれにルーターA、ルーターBが存在し、各ルーターに対してルーティングテーブルが関連付けられている、という認識です。
あるプライベートサブネットに対してNATゲートウェイを設定したくなったとき、ネクストホップにいないノードをターゲットに指定できるのは何故かと疑問に思ったことが始まりで勘違いが解けたため、ここにまとめようと思います。
実際の仕組み
実際は、サブネットごとに独立した物理的なゲートウェイが存在して通信を制御しているわけではありませんでした。
VPCにはユーザーが直接触れないような仮想的なルーターが一つ存在し、この仮想ルーターがサブネットやゲートウェイに対して紐づけられたルーティングテーブルをもとに、VPC内の通信を制御しています。
この仮想ルーターは、VPC内のすべてのサブネットやゲートウェイなどと「直接」接続されていると考えることができ、VPC内の通信はこの仮想的なルーターを中心に行われ、物理的な接続やゲートウェイの存在を気にする必要はありません。
仮想ルータはターゲットとなり得る各AWSサービスとの接続や通信方法を知っており、IPがわからずとも次のようなものをターゲットとして指定できるのでした。
- インターネットゲートウェイ
- NATゲートウェイ
- トランジットゲートウェイ
- VPCピアリング接続
- VPCエンドポイント
- VPN接続
- ネットワークインターフェース
インターネットやVPC外の特定のネットワークにアクセスする際に経由させるゲートウェイや接続だけでなく、VPC内のサブネット間通信で経由させたいノードに関しても指定できるようになっているんですね。
そしてVPC内の仮想ルーターは、トラフィックが発生した際はそれがどのサブネットやゲートウェイから来ているのかを判断し、そのサブネットやゲートウェイに関連づけられているルーティングテーブルに基づいてトラフィックをルーティングすることになります。
まとめ
一般的なネットワークの知識とAWSの仮想的なネットワーク環境を混同していたために、VPC内の通信制御の仕組みや「サブネットにルーティングテーブルを紐付ける」ことが実際にどのような形で行われるかが良く分かっていませんでした。
物理的なネットワーク環境では、サブネットやVLANごとに独立したルーターやスイッチが存在することが多いですが、AWS VPCは完全に仮想的な環境なので、そのような制約や構造は存在しません。
ルーティングの仕組みを理解するにあたっては、この辺りのAWSのドキュメントやスライドを参考にさせていただきました。