Transit Gatewayを設定して、同一リージョン内の複数VPC間でEC2インスタンス同士の通信を行ってみた
はじめに
こんにちは、おのやんです。
みなさん、異なる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独特の概念が出てきたと思います。最初はとっつきにくいかもしれませんが、理解してしまえばシンプルなものです。
こちらの記事がお役に立てれば幸いです。では!
参考資料