クラウドの「住所」を操る!AWS VPCのルートテーブル、暗黙と明示の不思議な関係
こんにちは!クラウドの深淵を駆け巡るSREエンジニアです。
皆さんはクラウド環境で初めてVPC(Virtual Private Cloud)を構築したとき、こんな経験はありませんか?「特に設定した覚えはないのに、なぜかサブネット同士が通信できる」「ルートテーブルを触ったら、突然インターネットに繋がらなくなった……!」
これらは、クラウドインフラを学ぶ誰もが一度は通る道です。今日は、そんなVPCのネットワーク設計の要である「ルートテーブル」について、郵便配達の仕組みに例えながら、その「優先順位のルール」を紐解いていきましょう。
—
1. ルートテーブルは「配達先の案内板」
VPCを一つの巨大な「街」だと想像してください。その街の中には、たくさんの小さな「地区(サブネット)」があります。
パケット(データ)は、この街の中を走り回る郵便物です。そしてルートテーブルとは、郵便配達員さんが「この宛先なら、あっちの門を通って外へ行こう」と判断するための「案内板」のことです。
クラウドの世界では、ルートテーブルがないとパケットは迷子になります。しかし、AWSなどのクラウドでは、何も設定しなくても自動的に「メインルートテーブル」という案内板が用意されていますよね。これが「暗黙のルール」の正体です。
—
2. 「暗黙のルール」と「明示的な紐付け」
VPCを作ると、必ず一つメインルートテーブルが作成されます。
- 暗黙の紐付け: サブネットを新しく作ったとき、特に指定しなければ、このメインルートテーブルが自動的に適用されます。これを「暗黙の紐付け」と呼びます。
- 明示的な紐付け: 逆に、自分で作ったルートテーブルを「このサブネットにはこれを使って!」と指定することを「明示的な紐付け」と言います。
「なぜわざわざ明示的にするの?」 と思いますよね。それは、本番環境と開発環境でネットワークの出口(ゲートウェイ)を分けたり、セキュリティを強化するために「特別な案内板」が必要になるからです。
—
3. どっちが優先?ルーティング決定の「最長一致の法則」
さて、ここからが本題です。ルートテーブルにいくつもルール(ルート)が書かれているとき、パケットは一体どのルートを信じるのでしょうか?
ここで覚えてほしいのが「最長一致(Longest Prefix Match)の法則」です。
これは非常にシンプルです。「より具体的に指定されている宛先を優先する」というルールです。
郵便配達の例え
- ルールA: 「日本国内ならどこでも、とりあえず中央郵便局へ運ぶ」
- ルールB: 「東京都港区宛なら、港区支店へ運ぶ」
このとき、東京都港区宛の郵便物はどちらに行くでしょうか?そう、より詳細に指定されている「ルールB」に従って、港区支店へ行きますよね。
クラウドのIPアドレスでも同じです。
# ルートテーブルの例
# 1. 0.0.0.0/0 (インターネット全体) -> インターネットゲートウェイへ
# 2. 10.0.1.0/24 (特定のサブネット内) -> ローカルへ
パケットが 10.0.1.5 宛の場合、0.0.0.0/0 と 10.0.1.0/24 の両方に当てはまりますが、より絞り込まれた範囲である 10.0.1.0/24 が優先されるのです。
—
4. 実践:AWS CLIでルートを確認しよう
実際に現場で設定を確認するときは、AWS CLIを使うのが一番早いです。以下のコマンドで、現在のルートテーブルの状態を覗いてみましょう。
# 特定のルートテーブルの情報を取得するコマンド
aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef0
取得した結果の中に Routes という項目があります。
"Routes": [
{
"DestinationCidrBlock": "10.0.0.0/16", // VPC内全体(ローカル)
"GatewayId": "local" // 自動的に設定される最優先ルート
},
{
"DestinationCidrBlock": "0.0.0.0/0", // インターネット宛
"GatewayId": "igw-0a1b2c3d4e5f6g7h8" // インターネットゲートウェイへ
}
]
ここで重要なのは、local と書かれたルートは絶対に削除できないということです。これはVPC内の通信を司る心臓部だからです。私たちが設定するのは、それ以外の「外部への出口」の部分なんですね。
—
5. SREからのアドバイス:トラブルを避けるために
最後に、現場でよくある失敗談を一つ。
「インターネットに繋がらない!」と焦っているとき、多くの場合、ルートテーブルの 0.0.0.0/0 が Internet Gateway を向いていないか、そもそもルートテーブルの紐付けを忘れていることが原因です。
1. まずは「サブネット」と「ルートテーブル」の紐付けを確認する(明示的に紐付いているか?)
2. 次に「ルートテーブルの中身」を確認する(0.0.0.0/0 がちゃんと出口を向いているか?)
この二段構えでチェックすれば、ネットワークの迷宮で迷子になることはありません!
ネットワーク設計は、最初は難しく感じるかもしれません。でも、パケットという「郵便物」がどこへ向かおうとしているのかを想像するだけで、クラウドの動きは驚くほどクリアに見えてきますよ。
これからも一歩ずつ、一緒に学んでいきましょう!質問があれば、ぜひコメント欄で教えてくださいね。
コメント