Transit Gatewayを使ってみよう

はじめに

みなさん、Transit Gateway(以下TGW)使ってますか?TGW便利ですよね。

AWSの仕様としてVPCへの通信は1hopしかしない、というものがあります。
これはどういうことかというと、図のような構成の場合

VPC_BとVPC_Cは直接通信できないということです。

TGW登場以前はそういった通信を行うにはプロキシを立てる等のちょっとした工夫が必要でした。
また、複数のVPC間で相互に通信したい、という場合は大体以下の2択で、

  • 仮想ルータを使用してTransitVPCを作成し、スター型やハブスポーク型の構成にする → ネットワークの知識や仮想ルータの知識が必要
  • フルメッシュ型の構成にする → 対象のVPCが増えるごとにリンク数がものすごいことになる

と、どちらもそれなりにハードルが高かったり、構成管理が大変だったりしました。
※ちなみにn個のVPCでフルメッシュ構成をとった場合のリンク数は以下の式で求められます。
n(n-1)/2=リンク数
なので5個のVPCでフルメッシュ構成を取った場合は、10リンク必要になります。
5(5-1)/2=10

そこで登場したのがTGWでした。TGWによってネットワーク構成が非常にスッキリされた方もいるのではないでしょうか。
ただこのTGW、すごく便利なのですが使用にあたって少しばかり注意が必要です。
TGWに接続されたVPCやVPN接続全てが相互に通信するのであれば初期値のまま作成すればよいのですが、特定のVPC間は通信させたくない、といった場合はネットワークの知識がちょっとだけ必要になってきます。

目次

手順の概要

今回はA・B・C3つのVPCをTGWに接続したとき、

  • AはB・Cと通信できる
  • B・CはAとしか通信できない(B・C間は通信できない)
  • 上記の通信制御をルーティングで行う

といった構成を考えてみます。
※VPC及びインスタンスは既に作成済みの前提です

TGWの作成・設定は以下の順番で行っていきます。
1. TGWの作成
2. TGW Attachmentの作成
3. TGW Route Tableの作成
4. 通信確認
5. おまけの確認

手順

TGWの作成

VPC → Transit Gatewayと進んで、Create Transit Gatewayをクリックします。

今回はルーティングで通信制御を行うので、Default route table associationとDefault route table propagationのチェックを外します。
チェックを外したら、Create Transit Gatewayをクリックします。

作成に成功したらCloseをクリックします。
これでTGWが作成されました。

TGW Attachmentの作成

この時点では作成したTGWとVPCが紐付いていないので、対象のVPCと紐付けします。
Transit Gateway 接続をクリックしてCreate Transit Gateway Attachmentをクリックします。

Transit Gateway IDで先ほど作成したTGWを指定
Attachment typeは今回はVPCなのでそのままVPCに
Attachment name tagにはわかりやすい名前を入れておくと良いと思います
VPC IDは、紐付けたいVPCを指定
VPC ID
を指定すると、そのVPC内にあるサブネットが表示されるので、TGW経由で通信させたいサブネットにチェックを入れます
今回はサブネットが1つしかないので、そのままです

全てを入力したらCreate attachmentをクリックします

作成に成功したらCloseをクリックします。
これでTGWとVPC_Aが紐づきました。同じ様にVPC_B・Cも紐付けていきます。
Stateがavailableになるまでしばらく待ち、availableになると準備完了です。

TGW Route Tableの作成

これでTGWと各VPCが紐付いたのですが、この時点でもまだ通信ができません
TGW内とVPCにTGW向けのルートテーブルが無いのでルーティングしてくれないからです。
なので、次はルートテーブルの作成です。

Transit Gateway ルートテーブルをクリックしてCreate Transit Gateway Route Tableをクリックします。

Name tagにはわかりやすい名前を、Transit Gateway ID*は、対象のTGWを指定してCreate Transit Gateway Route Tableをクリックします。

作成に成功したらCloseをクリックします。
これでルートテーブルが1つ出来ました。
TGWに紐付いてるVPCは3つあるので、これもあと2つ作成します。
こちらもavailableになるまでしばらく待ちます。

availableになったら、各ルートテーブルとアタッチをそれぞれ紐付けましょう。まずはVPC_Aから行っていきます。
VPC_A用に作成したルートテーブルを選んで、Associationsタブを選択します。

Create associationをクリックして、Choose attachment to associate*で紐付けたいアタッチを選択します。
選択したらCreate associationをクリックします。

作成に成功したらCloseをクリックします。
ルートテーブルとアタッチの紐付けが行われると、このような画面になります。

次に、各ルートテーブルのルーティング設定をしていきます。
今回は、VPC_AはVPC_B・VPC_Cに通信できるが、VPC_B・VPC_CはVPC_Aとしか通信できないことを想定しているので、下記のように設定していきます。

  • ルートテーブルA → VPC_B・VPC_C向けのルーティングを設定
  • ルートテーブルB・C → VPC_A向けのルーティングのみ設定

では設定していきましょう。
ルートテーブルAを選択して、Routesタブをクリックします。

Create static routeをクリックして、CIDR*にVPC_BのCIDR、Choose attachmentにVPC_Bと紐付いてるアタッチを指定します。
選択したら、Create static routeをクリックします。

作成に成功したらCloseをクリックします。
同じ様にVPC_C向けのルーティング設定もしていきます。
作成後の画面がこちらです。

同様にルートテーブルB・Cでも、VPC_A向けのルーティングを設定します。

最後に各VPCのルートテーブルを設定します。
TGWからVPCへはルーティング情報を伝搬してくれないためこの設定が必要になります。
VPCのルートテーブル画面に移動します。

ルートテーブルAを選択するとこのような画面になるので、ルートを編集をクリックします。

ルートを追加をクリックしてVPC_B・VPC_C向けのルーティングを追加し、ターゲットをTGWアタッチにします。
設定したら、変更を保存をクリックします。

無事にルートが追加できました。同じ様にVPC_B・VPC_CでもVPC_A向けのルーティングを設定します。

通信確認

これで準備が整いましたので、疎通確認をしてみましょう。
まずはVPC_Aから、VPC_B・VPC_Cにpingを打ってみます。
問題なく通りました。

次にVPC_BからVPC_A・VPC_Cにpingを打ってみます。
VPC_Aにはpingが通りますがVPC_Cへは通りません。

最後にVPC_CからVPC_A・VPC_Bにpingを打ってみます。
VPC_Aにはpingが通りますがVPC_Bへは通りません。

おまけの確認

ちなみに、この状態ではVPC_B・VPC_Cのルートテーブルでお互いのルートを設定しても、TGWアタッチに設定したルートテーブルにVPC_B・VPC_C間の疎通用ルートがないため通信できません。
試しにやってみましょう。

VPC_BのルートテーブルにVPC_C宛のルートを追加

VPC_CのルートテーブルにVPC_B宛のルートを追加

VPC_Aから、VPC_B・VPC_Cにping

VPC_BからVPC_A・VPC_Cにping

VPC_CからVPC_A・VPC_Bにping

まとめ

以上で、TGWを使用した通信制御の設定例になります。
使い方さえ覚えればとても便利なので、機会があればぜひ使用してみてください。

投稿者プロフィール

maeda
maeda
最新の投稿