Transit Gatewayを設定して、同一リージョン内の複数VPC間でEC2インスタンス同士の通信を行ってみた

Transit Gatewayを使って2つのVPCを接続し、EC2間で通信を行います。シンプルな構築を試すことで、Transit Gatewayの設定方法や機能を理解していきます。
2023.08.31

はじめに

こんにちは、おのやんです。

みなさん、異なるVPC間で通信したいと思ったことはありませんか?私はあります。

VPC間で通信を行う手段のひとつに、Transit Gatewayがあります。このTransit Gatewayですが、VPC同士で通信をさせようとすると、独特の概念が出てきて戸惑うことがあります。そういった取っ付きにくさを解消するために、今回はシンプルな環境にTransit Gatewayを導入します。これらの作業を通じて、構築の手順や機能の理解を目指します。

目指すところ

初期の構成図がこちらになります。同一リージョン内に2つのVPCがあり、それぞれプライベートサブネットの中でEC2インスタンスが動作しています。

最終的にはこちらのようにTransit Gatewayを設定し、EC2間で通信できる状態を目指します。

Transit Gatewayの構築

Transit Gatewayを構築していきます。

Transit Gatewayの作成

VPCの画面から、Transit Gatewayを選び、「Transit Gatewayの作成」を選びましょう。

今回はxxxx-vpcとyyyy-vpcを接続するため、xy-tgwみたいな名前をつけておきましょう。

また、今回は手動でイチからルートテーブルを設定したいため、「デフォルトルートテーブルの関連づけ」と「デフォルトルートテーブル伝播」のチェックは外しておきます。

残りの設定は今回はデフォルトのまま進めしょう。「Transit Gatewayの作成」をクリックします。

ステータスがAvailableになっていれば、作成完了です。

この時点で、構成図は以下のようになります。現時点ではTransit Gatewayが作成されているだけの状態です。ここから、VPC同士で通信できる設定を行っていきます。

Transit Gateway ルートテーブルの作成

Transit Gateway ルートテーブルを作成します。Transit Gateway ルートテーブルは、Transit Gatewayを経由する通信の送信元と送信先を定義するテーブルです。設定項目はVPC版のルートテーブルとそれほど変わりません。

さきほどのTransit Gateway作成時に、「デフォルトルートテーブルの関連づけ」のチェックを外しました。そのため、Transit Gateway ルートテーブルは作成されていません。VPCの画面から「Transit Gateway ルートテーブル」に遷移し、「Transit Gateway ルートテーブルの作成」を選択します。

今回はxy-tgw-rtbという名前をつけておきましょう。また、このルートテーブルがどのTransit Gatewayのものなのかを指定します。さきほど作成したTransit Gatewayを選択できますので、こちらを選択しておきます。これらが完了したら、「Transit Gateway ルートテーブルを作成」をクリックします。

状態がAvailableになっていたら作成完了です。

この時点で、こちらのようにTransit Gatewayにルートテーブルが設定された状態となります。

Transit Gateway アタッチメントの作成

次に、Transit Gateway アタッチメントを作成します。Transit Gateway アタッチメントを設定することで、Transit GatewayとVPCを紐づけることができます。今回だとxxxx-vpcもyyyy-vpcもxy-tgwに関連づけられていません。そのため、各VPCでアタッチ作業を行っていきます。

VPCの画面で「Transit Gateway アタッチメント」の遷移し、「Transit Gateway アタッチメントの作成」を選択します。

まずxxxx-vpcとTransit Gatewayを関連付け(アタッチ)しましょう。xxxx-vpcと関連づけるため、アタッチメントタイプは「VPC」です。今回は1つのプライベートサブネットのみ作成していますが、サブネットが複数作成していた場合は、Transit Gatewayと通信したいサブネットを選択します。

これらが設定できたら、「Transit Gateway アタッチメントを作成」をクリックしましょう。

状態がAvailableになっていれば作成完了です。

この時点で、構成図は以下のようになっています。

同様に、Transit Gatewayをyyyy-vpcとも関連付けます。作成手順はxxxx-vpcに関連づけた際と同様です。ことのき、xxxx-vpcをyyyy-vpcに変えておきましょう。

こんな感じで、さきほど作成したTransit Gatewayに対して、xxxx-vpcとyyyy-vpcを関連付けることができました。

現時点での構成はこんな感じです。Transit Gatewayと各VPCが関連付けされている状態ですね。

ルートテーブルとTransit Gateway アタッチメントとの関連付け

このままでは、また通信はできません。そのため、ルートテーブルをTransit Gatewayに関連づけます。

ちなみに、ルートテーブルと関連づけるのはTransit Gateway アタッチメントです。初めてTransit Gatewayを触る方はややこしいと思うかもしれませんので、ご注意ください。

それでは、実際に関連付けを行いましょう。VPC画面から「Transit Gateway ルートテーブル」に遷移して、先ほど作成したxy-tgw-rtbmを選択します。すると、画面下部にいくつかタブが表示された設定画面が表示されるので、「関連付け」タブから「関連付けを作成」をクリックします。

ここれ、ルートテーブルと関連付けしたいVPC(実態はVPCと関連づけたTransit Gateway アタッチメント)を選択します。今回はxxxx-vpcを選択します。

こちらの「関連付け」タブから、Transit Gateway ルートテーブルと、xxxx-vpcにアタッチしてTransit Gateway アタッチメントが関連づけられていることが確認できますね。

この時点で、構成図はこんな感じになっています。ルートテーブルが、xxxx-vpc側のTransit Gateway アタッチメントに関連付けられています。

同様に、ルートテーブルとyyyy-vpcを関連づけます。「関連付けを作成」画面を選択して、関連づけるアタッチメントにyyyy-vpcのTransit Gateway アタッチメントを選択し、作成します。

作成が完了したら、xxxx-vpcとyyyy-vpcの2つのVPC分の関連付けが作成されていることが確認できます。

これで、ルートテーブルとTransit Gatewayの関連付けが完了しました。この時点で、構成図はこんな感じになります。

ルートの追加

ここから、Transit Gateway ルートテーブルに各VPCへのルートを追加していきます。

まず、xxxx-vpcのルートを追加します。「Transit Gateway ルートテーブル」画面の「伝播」タブを開いて、「伝達を作成」をクリックします。

xxxx-vpcにアタッチされているTransit Gateway アタッチメントが選択できますので、そちらを選択して作成します。

作成が完了すると、伝播の部分にxxxx-vpcのアタッチメントが追加されていることがわかります。

この時点で、構成図はこんな感じになります。マネジメントコンソール上だとちょっと分かりにくいですが、宛先としてxxxx-vpcのIPv4が、実際に通信するターゲットとしてxxxx-vpcのTransit Gateway アタッチメント(ここでは便宜上アタッチメントXと書いておきます)が、ルートテーブル内に設定されています。

同様に、yyyy-vpcへのルートも設定しておきましょう。「伝播を作成」からyyyy-vpcのアタッチメントを選択し、「伝播を作成」をクリックします。

yyyy-vpcのルートも追加されていますね。

この時点で、構成図は以下のようになります。これで、Transit Gateway側の設定は完了です。

サブネットのルートテーブルにTransit Gatewayへのルートを追加

最後に、サブネットのルートテーブルにTransit Gatewayへのルートを追加します。

VPC画面の「ルートテーブル」からxxxx-vpcのルートテーブルを選択し、「ルート」タブから「ルートを編集」をクリックします。

送信先には、yyyy-vpcのIPv4を、ターゲットには上記で作成したTransit Gatewayを選択して保存します。

このように、yyyy-vpcへのルートが作成されました。

構成図としてはこんな感じになります。

同様に、yyyy-vpcのルートテーブルに対して、xxxx-vpcへのルートを作成します。

こちらは送信先にxxxx-vpcへのIPv4、ターゲットには同じTransit Gatewayを設定します。

このように、xxxx-vpcへのルートが作成されました。

こちらが最終的な構成図となります。

セキュリティグループの編集

複数VPC間で通信ができる確認として、EC2のpingを行います。そのため、互いの通信を許可するセキュリティグループのルールがEC2インスタンスに必要です。

こちらは、EC2画面に移ります。「セキュリティグループ」でxxxx-ec2を選択し、「インバウンドルール」にて「インバウンドのルールを編集」を選択します。

今回は、yyyy-vpcからの通信を許可するルールを追加しておきましょう。

同様に、xxxx-ec2のセキュリティグループにて、yyyy-vpcからの通信を許可するルールを追加します。

EC2インスタンス接続

それでは、各EC2インスタンスで通信してみましょう。

まずは、xxxx-ec2からyyyy-ec2への通信です。

sh-4.2$ ping 10.2.137.202 -c 5
PING 10.2.137.202 (10.2.137.202) 56(84) bytes of data.
64 bytes from 10.2.137.202: icmp_seq=1 ttl=254 time=0.913 ms
64 bytes from 10.2.137.202: icmp_seq=2 ttl=254 time=0.564 ms
64 bytes from 10.2.137.202: icmp_seq=3 ttl=254 time=0.645 ms
64 bytes from 10.2.137.202: icmp_seq=4 ttl=254 time=0.592 ms
64 bytes from 10.2.137.202: icmp_seq=5 ttl=254 time=0.623 ms

--- 10.2.137.202 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4069ms
rtt min/avg/max/mdev = 0.564/0.667/0.913/0.127 ms

こちらの通信は、構成図的には以下のようになっています。

同様に、yyyy-ec2からxxxx-ec2への通信です。

h-4.2$ ping 10.1.134.164 -c 5
PING 10.1.134.164 (10.1.134.164) 56(84) bytes of data.
64 bytes from 10.1.134.164: icmp_seq=1 ttl=254 time=0.788 ms
64 bytes from 10.1.134.164: icmp_seq=2 ttl=254 time=0.672 ms
64 bytes from 10.1.134.164: icmp_seq=3 ttl=254 time=0.585 ms
64 bytes from 10.1.134.164: icmp_seq=4 ttl=254 time=0.699 ms
64 bytes from 10.1.134.164: icmp_seq=5 ttl=254 time=0.636 ms

--- 10.1.134.164 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4103ms
rtt min/avg/max/mdev = 0.585/0.676/0.788/0.067 ms

こちらの通信は、構成図的には以下のようになっています。

さいごに

Transit Gatewayを使って2つのVPCを接続し、EC2間で通信を行いました。これらを実現する過程で、いくつかTransit Gateway独特の概念が出てきたと思います。最初はとっつきにくいかもしれませんが、理解してしまえばシンプルなものです。

こちらの記事がお役に立てれば幸いです。では!

 

参考資料