【Transit Gateway】アウトバウンド通信を集約する環境を構築してみる

2020.03.17

以下の環境を想定して、検証環境を構築してみました。

  • Transit Gateway(TGW) を使います。
  • 各VPC( APP#x VPC )のインターネットへのアウトバウンド通信を 1つのOutbound VPCのNATゲートウェイ 経由にします。

この構成をとることで、 VPCごとに NATゲートウェイを作成する必要が無くなります。

目次

  1. 構築内容・ルート設計
    1. APP1-VPC、Outbound-VPC の作成
    2. TGWの作成
    3. TGWアタッチメントの作成
    4. TGWルートテーブルの作成、関連付け
    5. ルート設計(行き)
    6. ルート設計(戻り)
    7. ルート設計(まとめ)
  2. 構築してみた
    1. 環境
    2. 作成スタック説明
    3. アウトバウンド接続確認
  3. 拡張する場合
    1. 新規 APP-VPCを追加する場合
    2. 2AZ へ拡張する場合
  4. おわりに

構築内容・ルート設計

今回の構築で作成したリソースを順番に説明していきます。

※以降説明するサブネットは全て 1AZ(ap-northeast-1a) です

APP1-VPC、Outbound-VPC の作成

土台を作ります。

  • APP1-VPC と Outbound-VPC を作成
  • APP1-VPC にはアウトバウンド通信のテストに使うインスタンスを配置
  • Outbound-VPC には NATゲートウェイを配置

TGWの作成

TGWを作成します。今回はTGWルートテーブを自分で編集する必要があるので、 以下オプションで作成します。

  • Default route table association: 無効
  • Default route table propagation: 無効

TGWアタッチメントの作成

以下TGW アタッチメント を作成します。

  • APP1-VPC の TGW用サブネット へのアタッチメント
  • Outbound-VPC の TGW用サブネット へのアタッチメント

ここで TGW用サブネット を併せて作成しています。

これは /28 といった小さな領域にしましょう。他のリソースと共存しないサブネットにアタッチするのが推奨されています。

Use a separate subnet for each transit gateway VPC attachment. For each subnet, use a small CIDR, for example /28.

– 引用: Transit Gateway Design Best Practices

TGWルートテーブルの作成、関連付け

TGWルートテーブルを新規作成します。 このルートテーブルを先程の 2つのアタッチメントに 関連付け(Association) させます

ルート設計(行き)

EC2インスタンスがインターネットへのアウトバウンド通信を行うときの 行きの通信 を考えながらルートテーブルを考えます。

  • ① VPCルートテーブル(インスタンス用サブネット): デフォルトで TGW に向けます
  • ② TGWルートテーブル: デフォルトで Outbound-VPC アタッチメント に向けます
  • ③ VPCルートテーブル(Outbound-VPC TGW用サブネット): デフォルトで NATGW に向けます
  • ④ VPCルートテーブル(NATGW用サブネット): デフォルトで InternetGateway(IGW) に向けます

ルート設計(戻り)

EC2インスタンスがインターネットへのアウトバウンド通信を行うときの 戻りの通信 を考えながらルートテーブルを考えます。

  • ① VPCルートテーブル(NATGW用サブネット): APP1-VPC(10.1.0.0/16) 宛の通信を TGW に向けます
  • ② TGWルートテーブル: APP1-VPC(10.1.0.0/16) 宛の通信を APP1-VPC アタッチメント に向けます
  • ③ VPCルートテーブル(APP1-VPC TGW用サブネット): 宛先はローカルです。特にルートを加えることはありません。

ルート設計(まとめ)

最終的にルートテーブルは以下のようになります。

構築してみた

AWS Cloud Development Kit (CDK) を使って構築してみました。言語は Pythonです。 作成したプロジェクトは以下にあります。

環境

  • CDK: 1.27.0
  • Python: 3.7.3

作成スタック説明

このプロジェクトで作成されるスタック ( ./stacks )は以下のとおりです。

  • 1. AppNwStack: APP-VPC のネットワーク構成要素(ルーティング除く)
  • 2. AppInstanceStack: APP-VPC 内に配置するEC2インスタンス
  • 3. OutNwStack: Outbound-VPC のネットワーク構成要素(ルーティング除く)
  • 4. TgwStack: TGWと TGWアタッチメント
  • 5. TgwRouteStack: TGWルートテーブル
  • 6. VpcRouteStack: APP-VPC, Outbound-VPCのルーティング

アウトバウンド接続確認

デプロイして作成された EC2インスタンスへ SystemsManagerの Session Manager で入ってみます。

curl -I https://dev.classmethod.jp/ を実行してインターネットへのアウトバウンド通信ができるかどうか確かめてみます。

ちゃんと情報取得できていますね。アウトバウンド通信ができていることが分かりました。

拡張する場合

新規 APP-VPCを追加する場合

下図のように、新規アタッチメントとTGWルートテーブル関連付けを行い、 一部ルートを追加してやります(赤字)。APP2-VPC内の設定内容は APP1-VPCと同じです。

2AZ へ拡張する場合

そのまま 複製するように、TGWアタッチメント/TGWルートテーブルを新規作成します。

以下は AZ-A と AZ-Cで それぞれアウトバウンド通信を集約する環境を作った場合です。

おわりに

TGW絡みはルートテーブルの設計が少し複雑です。行きの通信だけではなく、戻りの通信も考慮することが大事です。

この記事が少しでもどなたかのお役に立てば幸いです。