【Transit Gateway】アウトバウンド通信を集約する環境を構築してみる
2022/04/06更新: 2022年版のブログ書いてます。こちらを御覧ください。
ーーーーーーーーーーー
以下の環境を想定して、検証環境を構築してみました。
- Transit Gateway(TGW) を使います。
- 各VPC(
APP#x VPC
)のインターネットへのアウトバウンド通信を 1つのOutbound VPCのNATゲートウェイ 経由にします。
この構成をとることで、 VPCごとに NATゲートウェイを作成する必要が無くなります。
目次
構築内容・ルート設計
今回の構築で作成したリソースを順番に説明していきます。
※以降説明するサブネットは全て 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.
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/
を実行してインターネットへのアウトバウンド通信ができるかどうか確かめてみます。
ちゃんと情報取得できていますね。アウトバウンド通信ができていることが分かりました。
おわりに
TGW絡みはルートテーブルの設計が少し複雑です。行きの通信だけではなく、戻りの通信も考慮することが大事です。
この記事が少しでもどなたかのお役に立てば幸いです。