Transit Gatewayを利用してVPC間で通信してみた
Transit Gatewayは複数VPCや、オンプレミスを単一のゲートウェイで接続することができるサービスです。Transit Gateway登場以前は、接続先が増えるたびにピアリングや、Direct Connect等でフルメッシュ構成が必要でした。
そんなTransit Gatewayが先日、東京リージョンでDirect Connectサポートを発表しました。これによりTransit Gatewayの利用を検討する機会が増えそうです。(体感)
本エントリでは、Transit Gatewayの理解を深めるために、Transit Gatewayの用語を交えつつ、シンプルな構成 *1で実際に構築してみたいと思います。
構成&前提
構成
最終的には以下のような構成で、各VPCから双方向に通信を実施してみたいと思います。
前提
以下VPC、EC2が作成済みであることを前提としています。
やってみた
Transit Gateway作成
VPCコンソールより[Transit Gateway]-[Create Transit Gateway]をクリックします。
ここでは、アソシエーション、プロパゲーション(後ほど手動で行います)等のデフォルトのチェックは外しました。[Name tag]に任意の名称を指定し[Create Transit Gateway]をクリックします。
「State」が「available」になることを確認してください。
Transit Gatewayが作成できると、以下のようなイメージになります。
ルートテーブル作成
Transit Gatewayが持つ経路情報テーブル(ルートテーブル)を作成します。このルートテーブルは、通信のネクストホップの決定に利用されます。Transit Gatewayはルートテーブルを複数作成できますが、ここでは単一のルートテーブルを作成します。以下は、ルートテーブル作成後のイメージです。
Transit Gateway作成時にデフォルトのチェックを外していたため、現時点でルートテーブルは存在しません。
「Create Transit Gateway Route Table」をクリックします。
ルートテーブルに任意の名称を付け、さきほど作成したTransit Gatewayを指定します。
アタッチメント
VPCやDirect Connect等をTransit Gatewayに紐付ける作業を行います。アタッチメント後は、以下のようなイメージになります。
A-VPC
A-VPC(イメージ左)をアタッチメントします。[Create Transit Gateway Attachment]をクリックします。
さきほど作成したTransit Gatewayをアタッチメント先に指定します。アタッチメントするVPC、サブネットを指定し[Create attachment]をクリックします。
「State」が「available」になるとアタッチメントは完了です。
B-VPC
B-VPC(イメージ右)をアタッチメントします。作業手順は同様です。アタッチメントするVPCにB-VPC、サブネットを指定し[Create attachment]をクリックします。
「State」が「available」になるとアタッチメントは完了です。
アタッチメントは完了しましたが、これだけでは通信を行うことができません。
アソシエーション
アタッチメントしたVPC等をルートテーブルに紐付けます。それにより、ルートテーブルにパケットが送信されるようになります。アソシエーション後のイメージです。
A-VPC
A-VPC(イメージ左)をアソシエーションします。[Create association]をクリックします。
A-VPCのアタッチメントを指定し、[Create association]をクリックします。
アソシエーションが確認できました。
B-VPC
B-VPC(イメージ右)をアソシエーションします。作業手順は同様です。B-VPCのアタッチメントを指定し、[Create association]をクリックします。
アソシエーションが確認できました。
プロパゲーション
アタッチメントしたVPCからルートテーブルに経路を伝播します。アソシエートしたVPCからプロパゲーションされることでルートテーブルが完成し、アタッチメントしたリソース間(ここではVPC)で通信が可能になります。プロパゲーションが実施後のイメージです。
A-VPC
A-VPC(イメージ左)をプロパゲーションします。[Create propagation]をクリックします。
A-VPCのアタッチメントを指定し、[Create propagation]をクリックします。
「State」が「enabled」になると、ルートテーブルに経路が追加されます。
B-VPC
B-VPC(イメージ右)をプロパゲーションします。作業手順は同様です。B-VPCのアタッチメントを指定し、[Create propagation]をクリックします。
「State」が「enabled」になると、ルートテーブルに経路が追加されます。
なお、プロパゲートはアソシエートに関係なく、複数ルートテーブルに設定可能です。
サブネットのルートテーブルに経路追加
通信を行いたい各サブネットのルートテーブルに、Transit Gatewayへの経路を追加します。
A-Subnet
B-Subnetへの経路を追加します。送信先にB-SubnetのCIDR、ターゲットには作成したTransit Gatewayを指定します。
B-Subnet
A-Subnetへの経路を追加します。送信先にA-SubnetのCIDR、ターゲットには作成したTransit Gatewayを指定します。
セキュリティグループ編集
各セキュリティグループで通信を許可します。
アクセス確認
Transit Gatewayにアタッチメントしたリソース間で通信を確認してみます。
A-Server → B-Server
[ec2-user@ip-10-0-0-161 ~]$ ping -c 3 172.16.0.107 PING 172.16.0.107 (172.16.0.107) 56(84) bytes of data. 64 bytes from 172.16.0.107: icmp_seq=1 ttl=254 time=0.955 ms 64 bytes from 172.16.0.107: icmp_seq=2 ttl=254 time=0.595 ms 64 bytes from 172.16.0.107: icmp_seq=3 ttl=254 time=0.674 ms --- 172.16.0.107 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2018ms rtt min/avg/max/mdev = 0.595/0.741/0.955/0.156 ms
B-Server → A-Server
[ec2-user@ip-172-16-0-107 ~]$ ping -c 3 10.0.0.161 PING 10.0.0.161 (10.0.0.161) 56(84) bytes of data. 64 bytes from 10.0.0.161: icmp_seq=1 ttl=254 time=0.992 ms 64 bytes from 10.0.0.161: icmp_seq=2 ttl=254 time=0.639 ms 64 bytes from 10.0.0.161: icmp_seq=3 ttl=254 time=0.759 ms --- 10.0.0.161 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2025ms rtt min/avg/max/mdev = 0.639/0.796/0.992/0.150 ms
想定通りの通信が確認できました。
さいごに
Transit Gatewayの理解を深めるためにシンプルな構成で構築を実施してみました。VPC、VPN、Direct Connectなど、接続するポイントが多く想定される場合は、Transit Gatewayの利用を検討してみてはいかがでしょうか。
以上、坂巻(@nochi251)でした!
参考
- 「Transit Gateway Deep Dive アーキテクチャガイド」 | AWS Summit Tokyo 2019
- Transit Gateways
- 新機能 – トランジットゲートウェイでネットワークアーキテクチャをシンプルに
脚注
- 単一のVPC間通信でTransit Gatewayを利用することはないと思いますが.. ↩