AWS Transit Gatewayを使用した通信制御をやってみた①

#AWS Transit Gatewayとは？
VPCやオンプレミスを行き来するルートを一か所に集約できるサービスです。（たぶん）
詳しくは公式のドキュメントを見てください。
→[AWS Transit Gateway（VPC およびアカウント接続を簡単にスケール）| AWS](https://aws.amazon.com/jp/transit-gateway/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc)

#概要と全体構成図
AWS Transit Gateway（以下：TGW）を使用して、
① VPC(test-a) → TGW → VPC(test-palo) → インターネット
② VPC(test-a) → TGW → VPC(test-palo) →TGW → VPC(test-b)（VPC間通信）
という2つの通信をやってみました。
※インターネットに抜けるときも、VPC間通信するときも、FW（PaloAlto VM）を通過させます。
　インターネットに出れていることをログで確認するためにPaloAltoを置いてみました。

↓ こんな感じの構成を作成していきます。

|![target.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/e74fd309-3584-cf88-9725-bfb1687a4080.png)|
|:-:|

端的にまとめると、TGWアタッチメントをルートテーブルにAssosiationすることにより、TGWアタッチメントが参照するルートテーブルを指定できるので、それをうまく使ってルートテーブルを分けることにより、①，②の通信を実現させる感じです。


#１．VPC作成
超基本的なことから書いていきますが、知ってる人は飛ばしてください。
（半年前の自分のような）無知の極みから始めた人のために一応書きました。

AWSマネジメントコンソールにログイン＞左上の「サービス」＞「VPC」＞左の一覧から「VPC」＞右上の「VPCを作成」
上記の流れでクリックしていくと、こんな画面が出てくるので、赤枠のところを埋めます。

※VPCのCIDRは下記URLに書いてある範囲で指定できます。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html#VPC_Sizing

|![make vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/f023a32a-711b-a152-796b-eb55116c1a48.png)|
|:-:|

赤枠を埋めたら、右下の「VPCを作成」をクリックします。
そうするとVPC完成です。

今回の検証には、いま作成したVPCを含めて3つ必要なので、同様にあと2つのVPCを作成します。

|![vpc lists.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/9ee4c4ca-62b3-fbcf-892e-68f7b842b087.png)|
|:-:|

こんな感じで3つ出来ていればOKです。


#２．TGW作成
##２－１．Transit Gatewayの作成
２．と２－１．で、なんで同じこと書いてあるんだろうって思うかもしれませんが、作っていくうちに察すると思うのでスルーしてください。

左上の「サービス」＞「VPC」＞左の一覧から「Transit Gateway」＞左上の「Create Transit Gateway」
上記の流れでクリックしていくと、こんな画面が出てくるので、また赤枠のところを埋めます。
★VPN ECMP support、Default route table association、Default route table propagationの3つのチェックボックスは外しておいてください。

|![make tgw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/2f0861fb-1e2e-5ce1-a0ac-c6d88bce9234.png)|
|:-:|

赤枠を埋めて、チェックを外したら、画面右下にある「Create Transit Gateway」をクリックします。
TGW作成リクエストが成功しましたという画面が出たらOKです。Closeして大丈夫です。

|![make tgw succeeded.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/ef930d26-250c-9cdb-38e7-fa7b1f69ed70.png)|
|:-:|

Closeして、Transit Gateway画面にさっき作成したtest-tgwが表示されていて、Stateが「Available」になっていたらTransit Gatewayの作成は完了です。

でもこれだけではTGWは使えません。２－２．へ続きます。

##２－２．Transit Gateway接続（アタッチメント）の作成
###２－２－１．TGWアタッチメント用サブネットの作成
VPCをTGWに関連付けるためには、VPCにTGWアタッチメントを作成する必要があります。
そのTGWアタッチメントを作成するために、そのTGWアタッチメントを作成するサブネットをまずは作成します。

左上の「サービス」＞「VPC」＞左の一覧から「サブネット」＞右上の「サブネットを作成」
上記の流れでクリックしていくと、こんな画面が出てくるので、赤枠のところを埋めます。

|![make tgw-sub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/abdbeb8f-fac2-4125-d681-58f5eed1f2de.png)|
|:-:|

サブネットは適当に切ってください。
自分はアタッチメントを作成するだけのサブネットなので、最小サブネットにしようと思い/28にしました。
赤枠を埋めたら、画面右下にある「サブネットの作成」をクリックします。

★TGWアタッチメント用サブネットが各VPCに必要なので、同様の手順で残り2つのVPCにもTGWアタッチメント用サブネットを作成します。

|![subnet list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/d74a4d85-6dfa-1a0b-392a-1c1ea5e368e6.png)|
|:-:|

こんな感じで3つ出来ていればOKです。

###２－２－２．TGWアタッチメントの作成
準備ができたので、TGWアタッチメントを作成します。
左上の「サービス」＞「VPC」＞左の一覧から「Transit Gateway」＞左上の「Create Transit Gateway Attachment」
上記の流れでクリックしていくと、こんな画面が出てくるので、また赤枠のところを埋めます。

|![make tgw-attach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/560c6d6a-8b1f-b846-e9ff-2ca42a5ef9eb.png)|
|:-:|

■ Transit Gateway ID・・・２－１．で作成したTGWを指定する
■ Attachment Type・・・VPCでOK
■ Attachment name tag・・・適当に名前を付ける
■ VPC ID・・・TGWアタッチメントを作成するVPCを指定する
■ Subnet IDs・・・VPC IDを指定したら自動で選択肢が出てくるので、２－２－１．で作成したサブネットを指定する

赤枠を埋めたら、画面右下にある「Create attachment」をクリックします。
TGWアタッチメント作成リクエストが成功しましたという画面が出たらOKです。Closeして大丈夫です。

★TGWアタッチメントは各VPCに必要なので、同様の手順で残り2つのVPCにもTGWアタッチメントを作成します。

|![tgw-attach lists.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/ea47d259-bdb3-1e8f-c74d-6a804a99d546.png)|
|:-:|
こんな感じで3つのTGWアタッチメントが出来て、Stateが「available」になっていればOKです。
（もしもStateがpendingでも待っていればavailableになります。きっと。）

ちなみに現時点での構成図はこんな感じです。
最初に示した構成図と比べるとまだまだすっからかんですね。
さっきのTGWアタッチメントの作成で、赤線で示したような接続ができるイメージです。

|![until making tgw-attach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/8763eb07-1eb1-e5f1-785b-c0624478e485.png)|
|:-:|

##２－３．Transit Gatewayルートテーブルの作成
###２－３－１．インターネット通信用ルートテーブルの作成
Transit Gatewayの中身（？）、ルートテーブルを作ります。
左上の「サービス」＞「VPC」＞左の一覧から「Transit Gatewayルートテーブル」＞左上の「Create Transit Gateway Route Table」
上記の流れでクリックしていくと、こんな画面が出てくるので、また赤枠のところを埋めます。

|![make tgw-rtb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/2732a0e3-d83b-2a96-43cc-500406c8ad28.png)|
|:-:|
まず構成図上のtest-a(test-b)→test-palo(→Internet)を通すためのルートテーブルを作成します。
■ Name tag・・・適当につけてください
■ Transit Gateway ID・・・２－１．で作成したTGWを指定します

赤枠を埋めたら、右下の「Create Transit Gateway Route Table」をクリックします。
TGWルートテーブル作成リクエストが成功しましたという画面が出たらOKです。Closeして大丈夫です。

####■ Associations
そしたら、さっき作成したTGWルートテーブルを選択して（①）、Assosiationsをクリックします（②）。

|![tgw-rtb_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/fb1f0df1-2870-bfac-2d79-c96069011ff9.png)|
|:-:|
すると「Create association」が出てくるので、それをクリックして、また赤枠のところを埋めます。

|![tgw-rtb_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/4b7ec890-e743-8c06-a732-996859fb4121.png)|
|:-:|
■ Choose attachment to associate・・・インターネットに向かうためのルートテーブルなので、test-aのTGWアタッチメントを指定しています

赤枠を埋めたら、右下の「Create association」をクリックします。
TGWルートテーブルアソシエーションリクエストが成功しましたという画面が出たらOKです。Closeして大丈夫です。

そもそも、associationって何？って感じだと思うのですが、イメージはこんな感じです。

|![tgw-rtb_3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/de6e4c4c-ee8d-c9f9-d3b0-cd5cc63cff13.png)|
|:-:|
（色々調べてこんな感じだと理解したので、違ってたらごめんなさい。）

####■ Propagations
２－１．Transit Gatewayの作成にて、「Default propagation route table」のチェックを外したので、今回使用していない機能にはなりますが、プロパゲーションについても少しだけ触れておきます。
こちらにチェックを入れたままTGWを作成すると、TGWアタッチメントが属するVPC宛てのルートが、TGWのルートテーブルに自動で追加されます。
今回はルートテーブルを2つに分けたりする手前、このプロパゲーション機能は使わないことにしました。
意図しないルートテーブルを作りたくない場合はチェックを外した方がいいと思います。

####■ Routes
そしたら、またTGWルートテーブルを選択して（①）、今度はRoutesをクリックします（②）。

|![tgw-rtb_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/de6b7619-5a11-2a08-ff6b-0a0289f5e614.png)|
|:-:|

すると「Create static route」が出てくるので、それをクリックして、また赤枠のところを埋めます。

|![tgw-rtb_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/69553d3d-fdd4-30b1-5c51-ddf8dd3d0ebf.png)|
|:-:|

■ CIDR・・・インターネット通信用のルートテーブルなので、デフォルトルート（0.0.0.0/0）を作成します
■ Choose attachment・・・このルートのネクストホップとなるTGWアタッチメントを指定するので、今回はtest-paloのTGWアタッチメントを選択します

赤枠を埋めたら、右下の「Create static route」をクリックします。
TGWルート作成リクエストが成功しましたという画面が出たらOKです。Closeして大丈夫です。

ということで、いまの構成図はこんな感じです。

|![tgw-rtb_6_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625505/0747736b-0d14-a44d-c9e5-a2e9a5ae01b1.png)|
|:-:|
残るTGWの設定は、
・test-bのTGWアタッチメントを、test-rtb-to-internetに紐づけ（Associationsの追加）
・VPC間通信用ルートテーブルの作成（Associations、Routesの設定を含む）
です。

全体構成図とここまでの流れを踏襲すれば、残るTGWの設定もできると思います。

###ここで終わるの？って感じですが・・・
ちょっとかなり長くなりそうなので、続きは別の記事に書こうと思います。
残っているTGWの設定もそちらにちゃんと書きますので、少々お待ちください。
読んでくださりありがとうございました。

■ 続きの記事はこちら
→（作成中）