Transit Gateway ルーティング完全ガイド

クロスリージョン・クロスアカウントVPC接続の完全なルーティングパスを
「国際空港ハブ」のたとえ話で徹底理解

TGWルートテーブルはアタッチメント間のトラフィック転送先を決定する「空港の発着案内板」
VPCルートテーブルはTGWからルートを自動伝播しない。必ず手動更新が必要
TGWピアリングはクロスリージョン接続に使い、静的ルートのみサポート(自動伝播なし)
完全なパスは VPC RT → TGW RT → ピアリング → TGW RT → VPC RT の5段構成

国際空港ハブで理解するTransit Gateway

たとえ話:国際空港ハブ ネットワーク

あなたが東京から大阪、ニューヨーク、ロンドンへ旅行したいとします。各都市に直行便を飛ばすのは非効率ですよね? そこで「ハブ空港」を使います。東京はまずハブ空港へ行き、そこから各都市へ乗り継ぎます。

Transit Gatewayはまさにこの「ハブ空港」です。各VPC(都市)を直接つなぐ代わりに、 中央のハブを経由することで、管理がシンプルになります。 そして異なるリージョンのTGWをつなぐ「ピアリング」は、東京の成田空港とロンドンのヒースロー空港の間に 国際線を開設するようなものです。

✈️ 空港ハブ ↔ AWSサービス 対応マップ ✈️ 空港の世界 ☁️ AWSの世界 役割 🏛️ ハブ空港 すべてが集まる中継拠点 🟠 Transit Gateway (TGW) すべてのネットワーク接続が集まる中継地点 🏙️ 各都市 東京・大阪・NY・ロンドン 🖧 VPC 仮想プライベートクラウド 独立したネットワーク環境(ワークロードが稼働) 📋 空港の発着案内板 どの便がどのゲートから出発? 📐 TGWルートテーブル アタッチメント間の転送先定義 どのアタッチメントへトラフィックを転送するか定義 🛣️ 都市内の道路案内 市内のどの道を通る? 🚦 VPCルートテーブル ⚠️ 手動更新が必要! VPC内サブネットからのトラフィックの送り先を制御 🚪 空港ゲート(搭乗口) 各便の乗降口 🔌 TGWアタッチメント VPC / VPN / DX接続点 VPC、VPN、Direct Connectなどの接続ポイント 🌐 国際線ルート 成田⇔ヒースロー直行便 🔀 TGWピアリング ⚠️ 静的ルートのみ! 異なるリージョンのTGW同士を接続 🔄 航空会社の自動路線登録 新路線を自動で案内板に反映 ルート伝播 VPC/VPNからTGW RTへ自動反映 アタッチメントからルートを自動取得 🔧 チャーター便の手配 手動で路線を個別に手配 🔧 静的ルート ピアリング時は必須! 手動で定義する特定の経路 = = = = = = = = = = = = = = = =

図: 空港ハブのたとえ話と AWS サービスの対応マップ — 左の空港概念が右のAWSサービスに対応

全体アーキテクチャ図

クロスリージョン Transit Gateway アーキテクチャ 🇯🇵 東京リージョン (ap-northeast-1) 🇯🇵 大阪リージョン (ap-northeast-3) Account A Account B VPC-A 10.1.0.0/16 VPC-B 10.2.0.0/16 Transit Gateway tgw-tokyo-001 TGW Peering Transit Gateway tgw-osaka-001 Account C Account D VPC-C 10.3.0.0/16 VPC-D 10.4.0.0/16 VPC→TGW ピアリング TGW→VPC

図1: クロスリージョン・クロスアカウントでの Transit Gateway 接続アーキテクチャ

TGWルーティングの4大要素

TGWルートテーブル

空港の発着案内板に相当。アタッチメント間でトラフィックの転送先を定義します。 デフォルトルートテーブルのほか、カスタムルートテーブルを作成して セグメンテーション(分離)が可能です。

静的ルート

チャーター便の手配に相当。管理者が手動で「宛先CIDRブロック → 特定アタッチメント」を定義。 TGWピアリング接続では必須(伝播が使えないため)。

ルート伝播

航空会社が自動で路線を登録するイメージ。VPCやVPNアタッチメントのCIDRブロックが TGWルートテーブルへ自動追加されます。 ただしピアリング接続では伝播がサポートされません

アタッチメント関連付け

各搭乗ゲートが特定のターミナルに所属するようなもの。各アタッチメントは1つのルートテーブルに 関連付けられ、そのテーブルに基づいてルーティングが行われます。

最重要ポイント: VPCルートテーブルはTGWルートテーブルとは完全に独立しています。 TGWがルートを自動で伝播しても、VPC側のルートテーブルは手動で更新しなければ通信できません。 これは「空港が路線を追加しても、市内の道路案内標識は自分で書き換える必要がある」のと同じです。

ルートテーブルの関係性

ルートテーブル検索フロー(パケットの経路選択) データプレーン ルーティング制御 VPC サブネット EC2 / Lambda VPC ルートテーブル 手動設定が必要 TGW アタッチメント TGW ルートテーブル 伝播 + 静的ルート ピアリング アタッチメント リモートTGW ルートテーブル リモートVPC 宛先サブネット 1.経路検索 2.転送 3.経路検索 4.転送 5.経路検索 6.配送 送信元VPC ローカルTGW ピアリング経由 宛先VPC パケットは VPC RT → TGW → TGW RT → ピアリング → リモートTGW RT → リモートVPC の順に処理される

図2: パケットの経路選択フロー — 各ルートテーブルの検索と転送の順序

完全なルーティングパス(6ステップ)

VPC-A(東京リージョン、10.1.0.0/16)のEC2インスタンスから、VPC-C(大阪リージョン、10.3.0.0/16)のEC2インスタンスへ通信する場合の完全なルーティングパスです。

① VPCルートテーブル検索(送信元VPC-A)
EC2(10.1.1.10)が 10.3.1.20 へパケットを送信。VPC-Aのルートテーブルで 10.3.0.0/16 → tgw-tokyo-001 のエントリを検索し、TGWへ転送。
💡 ここは手動設定が必要!
② TGWルートテーブル検索(東京TGW)
東京TGWがパケットを受信。VPC-Aアタッチメントに関連付けられたTGWルートテーブルで 10.3.0.0/16 → peering-attachment の静的ルートを検索。
③ TGWピアリングを通過
パケットがピアリング接続を通じて東京リージョンから大阪リージョンへ転送。 AWSバックボーンネットワーク上を暗号化されて転送されます。
④ TGWルートテーブル検索(大阪TGW)
大阪TGWがパケットを受信。ピアリングアタッチメントに関連付けられたルートテーブルで 10.3.0.0/16 → vpc-c-attachment のルート(伝播 or 静的)を検索。
⑤ VPCルートテーブル検索(宛先VPC-C)
VPC-Cのサブネットルートテーブルでローカルルート(10.3.0.0/16 → local)が一致。 VPC内のローカルルーティングでEC2(10.3.1.20)へ配送。
⑥ 戻りの通信(逆方向も同じ6ステップ)
レスポンスパケットは逆方向で同じ経路を辿ります。VPC-C RT → 大阪TGW RT → ピアリング → 東京TGW RT → VPC-A。 双方向のルート設定が必須です。
よくある落とし穴:片方向のルートしか設定していないケース。 行きの通信は成功しても、帰りのパケットがルーティングできず通信が失敗します。 必ず両方のVPCルートテーブル両方のTGWルートテーブルにルートを設定してください。

設定が必要なルートエントリ一覧

設定が必要なルートエントリ一覧(図解) 🇯🇵 東京リージョン (ap-northeast-1) 🇯🇵 大阪リージョン (ap-northeast-3) VPC-A ルートテーブル 🔧 手動 10.3.0.0/16 tgw-tokyo 10.4.0.0/16 tgw-tokyo 大阪VPC宛 → TGWへ Account A VPC-B ルートテーブル 🔧 手動 10.3.0.0/16 tgw-tokyo 10.4.0.0/16 tgw-tokyo 大阪VPC宛 → TGWへ Account B 東京 TGW ルートテーブル 10.1.0.0/16 VPC-A att 10.2.0.0/16 VPC-B att 10.3.0.0/16 Peering att 10.4.0.0/16 Peering att 東京リージョン内VPCの CIDRは自動伝播。 大阪リージョン向けは ピアリングへ静的ルート 自動伝播 静的ルート TGW Peering 静的のみ 大阪 TGW ルートテーブル 10.3.0.0/16 VPC-C att 10.4.0.0/16 VPC-D att 10.1.0.0/16 Peering att 10.2.0.0/16 Peering att 大阪リージョン内VPCの CIDRは自動伝播。 東京リージョン向けは ピアリングへ静的ルート 自動伝播 静的ルート VPC-C ルートテーブル 🔧 手動 10.1.0.0/16 tgw-osaka 10.2.0.0/16 tgw-osaka 東京VPC宛 → TGWへ Account C VPC-D ルートテーブル 🔧 手動 10.1.0.0/16 tgw-osaka 10.2.0.0/16 tgw-osaka 東京VPC宛 → TGWへ Account D 📌 凡例 ① VPC RT → TGW(手動設定) ② TGW RT → ピアリング(静的ルート) ③ TGW RT → VPC(伝播 or 静的) 自動伝播 = VPC/VPNアタッチメントから自動取得 静的ルート = ピアリング向けに手動追加が必要 🔧 手動 = VPC RTは常に手動設定 💡 Tip: VPCルートテーブルでは 10.0.0.0/8 → tgw のようなサマリールートで簡素化可能(意図しない転送に注意)

図3: 全ルートテーブルのエントリと転送フロー — 色分けで手動/自動を一目で判別

Transit Gateway ピアリングの詳細

たとえ:国際線の開設

TGWピアリングは、成田空港(東京TGW)とヒースロー空港(大阪TGW)の間に国際線を開設するようなものです。 国内線の路線(VPCアタッチメントの伝播)は自動で案内板に反映されますが、 国際線は両空港それぞれで手動で案内板に登録する必要があります。 また、片方だけ登録しても意味がなく、往復の両路線を登録しなければ旅行者が帰れなくなります。

クロスリージョン対応

異なるAWSリージョン間のTGWを接続可能。同一アカウントでも異なるアカウントでも利用できます。 転送はAWSグローバルネットワーク上で暗号化されます。

静的ルーティングのみ

ピアリングアタッチメントではルート伝播はサポートされていません。 相手リージョンのCIDRを手動で静的ルートとして追加する必要があります。

双方向構成が必須

両方のTGWルートテーブルに適切なルートを設定する必要があります。 片方向だけではレスポンスパケットが戻れず、通信が失敗します。

推移的ルーティング不可

TGW-A ↔ TGW-B ↔ TGW-C の構成で、TGW-Aから直接TGW-Cには通信できません。 TGW-A ↔ TGW-C の直接ピアリングが必要です(フルメッシュ)。

実装コード例

TGWピアリング構築とルート設定

# ===== 1. Transit Gateway の作成(東京リージョン) =====
aws ec2 create-transit-gateway \
    --description "Tokyo TGW" \
    --options AutoAcceptSharedAttachments=enable,\
DefaultRouteTableAssociation=enable,\
DefaultRouteTablePropagation=enable \
    --region ap-northeast-1

# ===== 2. VPCアタッチメントの作成 =====
aws ec2 create-transit-gateway-vpc-attachment \
    --transit-gateway-id tgw-0abc1234def567890 \
    --vpc-id vpc-0aaa1111 \
    --subnet-ids subnet-0aaa1111 \
    --region ap-northeast-1

# ===== 3. TGWピアリングの作成 =====
aws ec2 create-transit-gateway-peering-attachment \
    --transit-gateway-id tgw-0abc1234def567890 \
    --peer-transit-gateway-id tgw-0xyz9876abc543210 \
    --peer-region ap-northeast-3 \
    --region ap-northeast-1

# ===== 4. ピアリングの承認(大阪リージョン側) =====
aws ec2 accept-transit-gateway-peering-attachment \
    --transit-gateway-attachment-id tgw-attach-0peer1234 \
    --region ap-northeast-3

# ===== 5. 静的ルートの追加(東京TGW → 大阪CIDR) =====
aws ec2 create-transit-gateway-route \
    --transit-gateway-route-table-id tgw-rtb-tokyo001 \
    --destination-cidr-block 10.3.0.0/16 \
    --transit-gateway-attachment-id tgw-attach-0peer1234 \
    --region ap-northeast-1

# ===== 6. VPCルートテーブルの更新 =====
aws ec2 create-route \
    --route-table-id rtb-vpc-a \
    --destination-cidr-block 10.3.0.0/16 \
    --transit-gateway-id tgw-0abc1234def567890 \
    --region ap-northeast-1
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Transit Gateway with Cross-Region Peering'

Resources:
  # Transit Gateway(東京リージョン)
  TokyoTransitGateway:
    Type: AWS::EC2::TransitGateway
    Properties:
      Description: Tokyo Region TGW
      AutoAcceptSharedAttachments: enable
      DefaultRouteTableAssociation: enable
      DefaultRouteTablePropagation: enable

  # VPCアタッチメント
  VpcAAttachment:
    Type: AWS::EC2::TransitGatewayAttachment
    Properties:
      TransitGatewayId: !Ref TokyoTransitGateway
      VpcId: !Ref VpcA
      SubnetIds:
        - !Ref SubnetA

  # TGW静的ルート(大阪リージョン向け)
  RouteToOsaka:
    Type: AWS::EC2::TransitGatewayRoute
    Properties:
      TransitGatewayRouteTableId: !Ref TokyoTgwRouteTable
      DestinationCidrBlock: 10.3.0.0/16
      TransitGatewayAttachmentId: !Ref PeeringAttachment

  # VPCルートテーブルエントリ
  VpcARouteToOsaka:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref VpcARouteTable
      DestinationCidrBlock: 10.3.0.0/16
      TransitGatewayId: !Ref TokyoTransitGateway
# ===== Transit Gateway(東京リージョン) =====
resource "aws_ec2_transit_gateway" "tokyo" {
  description                     = "Tokyo Region TGW"
  auto_accept_shared_attachments  = "enable"
  default_route_table_association = "enable"
  default_route_table_propagation = "enable"

  provider = aws.tokyo
}

# ===== VPCアタッチメント =====
resource "aws_ec2_transit_gateway_vpc_attachment" "vpc_a" {
  transit_gateway_id = aws_ec2_transit_gateway.tokyo.id
  vpc_id             = aws_vpc.vpc_a.id
  subnet_ids         = [aws_subnet.vpc_a_private.id]

  provider = aws.tokyo
}

# ===== TGWピアリング =====
resource "aws_ec2_transit_gateway_peering_attachment" "tokyo_osaka" {
  transit_gateway_id      = aws_ec2_transit_gateway.tokyo.id
  peer_transit_gateway_id = aws_ec2_transit_gateway.osaka.id
  peer_region             = "ap-northeast-3"

  provider = aws.tokyo
}

# ===== 静的ルート(東京→大阪) =====
resource "aws_ec2_transit_gateway_route" "to_osaka" {
  destination_cidr_block         = "10.3.0.0/16"
  transit_gateway_attachment_id  = aws_ec2_transit_gateway_peering_attachment.tokyo_osaka.id
  transit_gateway_route_table_id = aws_ec2_transit_gateway.tokyo.association_default_route_table_id

  provider = aws.tokyo
}

# ===== VPCルートテーブル更新 =====
resource "aws_route" "vpc_a_to_osaka" {
  route_table_id         = aws_route_table.vpc_a.id
  destination_cidr_block = "10.3.0.0/16"
  transit_gateway_id     = aws_ec2_transit_gateway.tokyo.id

  provider = aws.tokyo
}

ベストプラクティス vs アンチパターン

✅ ベストプラクティス
🔹 VPCのCIDRは重複しないよう設計(IPAM活用推奨)
🔹 TGWルートテーブルを分離してセグメンテーション実施
🔹 VPCルートテーブルにはサマリールート(例: 10.0.0.0/8)を使用
🔹 双方向のルートを忘れず設定(チェックリスト活用)
🔹 RAM(Resource Access Manager)でクロスアカウント共有
🔹 VPC Flow Logsでトラフィックを監視
❌ アンチパターン
🔴 VPCのCIDRを重複させる(ルーティングが予測不能に)
🔴 デフォルトルートテーブルだけに依存(分離不可)
🔴 VPCルートテーブルの更新を忘れる(最頻出ミス)
🔴 ピアリングでルート伝播を期待する(サポート外)
🔴 推移的ルーティングが動作すると想定する(動作しない)
🔴 セキュリティグループだけで制御しNACLを無視

トラブルシューティング

🔴 症状: クロスリージョン通信ができない
原因1: ピアリングの静的ルートが未設定 / 原因2: VPCルートテーブルにTGW向けルートが未設定
🔧 修正: 両方のTGWルートテーブルに静的ルートを追加し、 両方のVPCルートテーブルにTGW向けルートを手動で追加する
🔴 症状: 行きは通るが帰りが通らない(タイムアウト)
原因: 逆方向のルートが設定されていない(非対称ルーティング)
🔧 修正: 戻り経路のルートがすべてのルートテーブル(VPC RT + TGW RT)に 存在することを確認
🔴 症状: 同一リージョン内のVPC間は通信できるがクロスリージョンだけ失敗
原因: ピアリングアタッチメントがルートテーブルに関連付けされていない
🔧 修正: aws ec2 associate-transit-gateway-route-table で ピアリングアタッチメントを適切なルートテーブルに関連付ける
🔴 症状: ピアリングの状態が "pendingAcceptance" のまま
原因: リモートリージョン側でピアリングリクエストが承認されていない
🔧 修正: リモートリージョンのアカウントで accept-transit-gateway-peering-attachment を実行する

試験対策ポイント

ANS-C01 / SAP-C02 頻出ポイント
① ルート伝播 vs 静的ルート — VPCアタッチメントは伝播可能、ピアリングアタッチメントは静的ルートのみ。この違いは必ず問われます。

② VPCルートテーブルの手動更新 — TGWルートテーブルの伝播とVPCルートテーブルの手動更新を混同させる選択肢が頻出。「VPCルートテーブルには手動設定が必要」が正解。

③ 推移的ルーティングの制限 — TGWピアリングは推移的ルーティングをサポートしません。3リージョン構成の場合、フルメッシュピアリングが必要です。

④ セキュリティグループとNACL — TGWを通過するトラフィックでも、宛先VPCのセキュリティグループとNACLは適用されます。

よくある質問(FAQ)

VPCピアリングは2つのVPCを直接1対1で接続します(ハブ不要)。一方、TGWピアリングは 2つのTGWを接続し、それぞれに接続された複数のVPCが相互に通信可能になります。 大規模環境(VPC数が多い場合)はTGWピアリングが圧倒的に管理しやすくなります。 VPCピアリングはN×(N-1)/2の接続が必要ですが、TGWなら各VPCは1つのアタッチメントだけで済みます。
ネットワークセグメンテーションが可能になります。例えば「本番環境」と「開発環境」のルートテーブルを分離し、 本番VPC同士は通信できるが開発VPCからは本番にアクセスできない、といった構成が実現できます。 たとえ話でいうと「国内線ターミナル」と「国際線ターミナル」を分けて、乗り継ぎ可能なルートを制御するようなものです。
最も多い原因はVPCルートテーブルの更新忘れです。TGWのルート伝播はTGWルートテーブルにのみ ルートを追加します。VPCのサブネットルートテーブルには自動反映されないため、 宛先CIDR → TGW ID のルートを手動で追加する必要があります。 また、セキュリティグループやNACLによるブロックも確認してください。
AWS Resource Access Manager(RAM)を使用します。TGWのオーナーアカウントがRAMで TGWリソースを別アカウントと共有し、共有先アカウントがVPCアタッチメントを作成します。 AWS Organizationsと連携すると、組織単位(OU)での一括共有も可能です。
TGWピアリング経由のデータ転送にはリージョン間データ転送料金が適用されます。 送信側リージョンから課金され、受信は無料です。 同一リージョン内のTGWアタッチメント間データ転送にも処理料金がかかるため、 コスト設計では「TGW処理料金 + リージョン間転送料金」の両方を考慮してください。

チートシート & まとめ

🚀 Transit Gateway ルーティング早見表
TGWルートテーブル
アタッチメント間の転送先を定義。VPCアタッチメントは伝播可能。ピアリングは静的ルートのみ。
VPCルートテーブル
TGWからの自動伝播なし。宛先CIDR → TGW のルートを手動で設定する必要あり。
ピアリング設定
リクエスト → 承認 → 静的ルート追加 → 双方向設定。推移的ルーティング不可。
完全パス
VPC RT → TGW → TGW RT → ピアリング → リモートTGW RT → リモートVPC(双方向で計10テーブル確認)
セグメンテーション
カスタムTGWルートテーブルで環境分離。本番/開発/共有サービスの分離が可能。
クロスアカウント共有
AWS RAM でTGWを共有。Organizations連携で OU 単位の一括共有も可能。

Created by SSuzuki1063

AWS SAP Learning Resources