Transit Gatewayのルートテーブル分離で特定VPC間だけ通信を許可してみる
はじめに
かつまたです。
Transit Gatewayを使って複数VPCを接続し、特定のVPC間だけ通信を許可する構成を試してみたので手順をご紹介します。
以下のような接続可否となるように構築しています。
- VPC-A ↔ VPC-B:通信可能
- VPC-B ↔ VPC-C:通信可能
- VPC-A ↔ VPC-C:通信不可
上記をTransit Gatewayのルートテーブル分離で実現し、動作確認まで行います。
Transit Gatewayでの選択的ルーティングについて
Transit Gatewayの選択的ルーティングは、関連付けと 伝播の2つの概念で制御されています。
関連付け
アタッチメントがどのルートテーブルを参照するかを決めます。各アタッチメントは1つのルートテーブルにのみ関連付けできます。
VPC-AからのトラフィックはVPC-A用ルートテーブルを参照し、VPC-A用ルートテーブルに存在するルートの宛先にのみ到達できます。
ルート伝播
アタッチメントのCIDRをどのルートテーブルに伝播させるかを決めます。1つのアタッチメントを複数のルートテーブルに伝播できます。
VPC-BのCIDR(10.2.0.0/16)をVPC-A用ルートテーブルとVPC-C用ルートテーブルの両方に伝播させることで、AとCの両方からBへの通信が可能になります。一方、VPC-AのCIDRをVPC-C用ルートテーブルに伝播させないことで、CからAへの通信を遮断しています。
やってみた
前提条件
本記事では、以下が構築済みであることを前提としています。

| リソース | 詳細 |
|---|---|
| VPC × 3 | VPC-A (10.1.0.0/16)、VPC-B (10.2.0.0/16)、VPC-C (10.3.0.0/16) |
| サブネット × 3 | 各VPCに1つ (ap-northeast-1a)、10.x.1.0/24 |
| セキュリティグループ × 3 | ICMP (10.0.0.0/8) と HTTPS (443) を許可 |
| VPCエンドポイント × 9 | ssm, ssmmessages, ec2messages を各VPCに作成 |
| インスタンスプロファイル | AmazonSSMManagedInstanceCore ポリシーをアタッチ |
| EC2 × 3 | Amazon Linux 2023、各VPCに1台 |
EC2インスタンスにはSSM Session Managerで接続します。キーペアやパブリックIPは不要です。
1.Transit Gateway の作成
VPCコンソールの左メニューから「Transit Gateway」→「Transit Gatewayを作成」を選択します。
以下の設定で作成します。
| 項目 | 設定値 |
|---|---|
| Amazon側ASN | 64512(デフォルト) |
| DNS サポート | 有効 |
| VPN ECMPサポート | 有効 |
| デフォルトルートテーブルの関連付け | 無効 |
| デフォルトルートテーブルの伝播 | 無効 |
| 共有アタッチメントの自動承認 | 無効 |

デフォルトルートテーブルの伝播は有効のままだと、すべてのVPCアタッチメントがデフォルトルートテーブルに自動的に関連付け・伝播され、全VPC間で通信可能になってしまうため、無効にしています。
2.VPC アタッチメントの作成
Transit Gateway が available になったら、各VPCをアタッチメントとして接続します。
左メニューの「Transit Gateway アタッチメント」→「Transit Gatewayアタッチメントを作成」から、VCP3つに対してVPCアタッチメントをそれぞれ作成します。

3.Transit Gateway ルートテーブルの作成
左メニューの「Transit Gateway ルートテーブル」→「Transit Gateway ルートテーブルを作成」から、3つのカスタムルートテーブルを作成します。

4.ルートテーブルの関連付け(Association)
各ルートテーブルに対応するVPCアタッチメントを関連付けます。
ルートテーブルを選択 →「関連付け」タブ →「関連付けを作成」で設定します。

| 作成するルートテーブル(名前は例) | 2で作成した関連付けるアタッチメント(名前は例) |
|---|---|
| TGW-RT-A | TGW-Attach-VPC-A |
| TGW-RT-B | TGW-Attach-VPC-B |
| TGW-RT-C | TGW-Attach-VPC-C |

関連付けにより、そのアタッチメントから入ってくるトラフィックは、関連付けられたルートテーブルを参照してルーティングされます。
5.ルート伝播の設定
各ルートテーブルを選択 →「伝播」タブ →「伝播を作成」で、以下のように設定します。

TGW-RT-A(VPC-A用)
- TGW-Attach-VPC-B → 伝播を作成する
- TGW-Attach-VPC-C → 伝播を作成しない
TGW-RT-B(VPC-B用)
- TGW-Attach-VPC-A → 伝播を作成する
- TGW-Attach-VPC-C → 伝播を作成する
TGW-RT-C(VPC-C用)
- TGW-Attach-VPC-B → 伝播を作成する
- TGW-Attach-VPC-A → 伝播を作成しない
この設定により、各ルートテーブルに以下のルートが自動的に追加されます。
| ルートテーブル | 伝播されたルート | 意味 |
|---|---|---|
| TGW-RT-A | 10.2.0.0/16 のみ |
A からは B にだけ到達可能 |
| TGW-RT-B | 10.1.0.0/16, 10.3.0.0/16 |
B からは A と C の両方に到達可能 |
| TGW-RT-C | 10.2.0.0/16 のみ |
C からは B にだけ到達可能 |
6.VPC ルートテーブルの設定
最後に、各VPCのサブネットルートテーブルに、他VPC宛トラフィックをTransit Gatewayへ向けるルートを追加します。
VPCコンソールの左メニュー「ルートテーブル」から対象VPCのルートテーブルを選択し、「ルート」タブ →「静的ルートを作成」で設定します。

- VPC-A のルートテーブル
| 送信先 | ターゲット |
|---|---|
| 10.1.0.0/16 | local(既存) |
| 10.2.0.0/16 | Transit Gateway名 |

- VPC-B のルートテーブル
| 送信先 | ターゲット |
|---|---|
| 10.2.0.0/16 | local(既存) |
| 10.1.0.0/16 | Transit Gateway名 |
| 10.3.0.0/16 | Transit Gateway名 |

- VPC-C のルートテーブル
| 送信先 | ターゲット |
|---|---|
| 10.3.0.0/16 | local(既存) |
| 10.2.0.0/16 | Transit Gateway名 |

7.接続テスト
EC2コンソールからSession Managerで各インスタンスに接続し、pingで通信確認を行います。
確認コマンドと出力例を記載します。
- Instance-A から
# A → B: 成功するはず
ping -c 4 10.2.1.10
PING 10.2.1.10 (10.2.1.10) 56(84) bytes of data.
64 bytes from 10.2.1.10: icmp_seq=1 ttl=126 time=1.58 ms
64 bytes from 10.2.1.10: icmp_seq=2 ttl=126 time=0.308 ms
64 bytes from 10.2.1.10: icmp_seq=3 ttl=126 time=0.438 ms
3 packets transmitted, 3 received, 0% packet loss
# A → C: タイムアウトするはず
ping -c 4 -W 3 10.3.1.10
PING 10.3.1.10 (10.3.1.10) 56(84) bytes of data.
4 packets transmitted, 0 received, 100% packet loss, time 3103ms
- Instance-B から
# B → A: 成功するはず
ping -c 4 10.1.1.10
PING 10.1.1.10 (10.1.1.10) 56(84) bytes of data.
64 bytes from 10.1.1.10: icmp_seq=1 ttl=126 time=0.476 ms
64 bytes from 10.1.1.10: icmp_seq=2 ttl=126 time=0.363 ms
4 packets transmitted, 4 received, 0% packet loss
# B → C: 成功するはず
ping -c 4 10.3.1.10
PING 10.3.1.10 (10.3.1.10) 56(84) bytes of data.
64 bytes from 10.3.1.10: icmp_seq=1 ttl=126 time=1.26 ms
64 bytes from 10.3.1.10: icmp_seq=2 ttl=126 time=0.417 ms
4 packets transmitted, 4 received, 0% packet loss
- Instance-C から
# C → B: 成功するはず
ping -c 4 10.2.1.10
PING 10.2.1.10 (10.2.1.10) 56(84) bytes of data.
64 bytes from 10.2.1.10: icmp_seq=1 ttl=126 time=0.613 ms
64 bytes from 10.2.1.10: icmp_seq=2 ttl=126 time=0.340 ms
4 packets transmitted, 4 received, 0% packet loss
# C → A: タイムアウトするはず
ping -c 4 -W 3 10.1.1.10
PING 10.1.1.10 (10.1.1.10) 56(84) bytes of data.
4 packets transmitted, 0 received, 100% packet loss, time 3117ms
すべて期待通りの結果になりました。
おわりに
ご覧いただきありがとうございました。
Transit Gatewayのルートテーブル分離を使うことで、NACLやセキュリティグループに頼らず、VPC間の通信を選択的に制御できることが確認できました。
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました






