【AWS】VPC同士を接続してみた（Transit Gateway 編）

## 概要
ピアリング接続された2つのVPC間の通信を、Transit Gatewayを使用した接続に移行してみた際の備忘録です。

[前回](https://qiita.com/sshimoyama/items/a1d828de38658bcc1875)は、VPCを2つ作成しVPCピアリングによって接続しましたが、今回はその接続をTransitGatewayに切り替えて同じようにVPC間の接続を確認してみます。

### なぜ？

VPCピアリングは1対1のVPC間相互通信を行う場合には非常に有用なサービスです。設定もとても簡単でしたね。

しかし、VPCピアリングには以下のような弱点も存在します。

- ピアリング接続を経由して、その先のVPC、インターネットゲートウェイ、VPN接続等に直接ルーティングすることは出来ない。（隣まではいけるが、「隣の隣」には行けない）
- 相互接続するVPCの数が増えた場合、フルメッシュ構成をとる必要があるため設定が煩雑になる。

詳細は以下のドキュメントが非常にわかりやすいです。

■サポートされていない VPC ピア接続設定
https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/invalid-peering-configurations.html



上記のような制約にお困りの場合に役に立つのが、**Transit Gateway**です。
Transit GatewayはVPCと他のネットワークを接続する中継ハブの役割を果たします。

■トランジットゲートウェイとは
https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/what-is-transit-gateway.html

## スタートとゴール
スタート：2つのVPCがピアリング接続されているところから
ゴール：VPC間の接続をTransit Gatewayに切り替えて、各VPCに起動したEC2間でICMP、sshの疎通を確認するところまで

:::note warn
料金について
Transit Gatewayは1アタッチメントあたり、1時間に0.07USDの料金がかかります。（2022/02/02現在）
試しに環境を構築してみる場合にはご注意ください。
:::
■AWS Transit Gateway の料金
https://aws.amazon.com/jp/transit-gateway/pricing/


###完成予想図
こんな感じの構成を作っていきます。
今回はVPC2つだけのシンプルな構成なので、ピアリング接続がTransit Gatewayに置き換わるだけのイメージですね。（インターネット経由で左側のVPC内のインスタンスへssh接続し、そこから右側のVPCへ疎通確認をします。）

![構成図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/d3264821-2533-fd85-70d2-61b10059b211.png)



##やってみた
###TransitGatewayの作成
VPCメニューの「Transit Gateway」から、「Transit Gatewayを作成」をクリック。
![Top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/9344ff08-4d8f-ca56-299f-9bd20fa85d1f.png)


必要事項を入力し、「Transit Gatewayを作成」をクリック。
今回はデフォルトルートテーブルの関連付け、伝播は後程手動で行うのでチェックを外しています。
（名前、タグはお好きにどうぞ）
![Create1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/98b8e6c3-d1a3-4464-e66a-df0dc80a66c4.png)
![Create2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/dd2a8cf7-4049-f048-ba1e-af177025c793.png)
![Create3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/8f56ddd4-2b35-0f69-c9d1-5605373bea44.png)


これでTransit Gatewayが作成されます。状態が Pending から Available に変わったら次へ進みましょう。
![Create4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/347b478e-be6d-a112-d140-4ab73b49a01b.png)

### Transit Gateway ルートテーブルの作成
次に、Transit Gateway ルートテーブルを作成していきます。
左メニューから「Transit Gateway ルートテーブル」を選択し、「Transit Gateway ルートテーブルを作成」をクリック。
![Top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/81345a12-b2d2-1c6c-7fc6-59c840fc20ea.png)

名前を入力し、先程作成したTransit Gatewayを指定したら「Transit Gateway ルートテーブルを作成」をクリック。
![Create1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/e9bf2ed2-9ab8-6635-788f-d60b21eee98c.png)
![Create1-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/776fdb8e-1f11-65bf-62ad-4a54bc6cf447.png)

これでTransit Gateway ルートテーブルが作成されます。状態が Pending から Available に変わったら次へ進みましょう。

### Transit Gateway アタッチメントの作成
Transit Gatewayと各VCPとの関連付け（アタッチメント）を作成していきます。
左メニューから「Transit Gateway 接続」を選択し、「Transit Gateway アタッチメントを作成」をクリック。

![Top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/45a528f9-5842-b614-c3eb-22ca24b380aa.png)

任意の名前、先程作成したTransit Gatewayを指定し、アタッチメントタイプは「VPC」を選択します。
![Create1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/5f16fbbc-37bf-33a3-58de-3c249f54724b.png)

DNSサポートにチェックを付け、関連付けたいVPCを選択、サブネットは関連付けたいサブネットを選択します。
![Create2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/98d7d35b-f40e-4362-75d9-fb8434402284.png)

これでアタッチメントの作成は完了です。
※関連付けたいVPC数分アタッチメントを作成してください。

状態が Available に変わったら次へ進みましょう。

### アソシエーションの作成
Transit GatewayにアタッチメントしたVPC等を、Transit Gateway ルートテーブルへ関連付け（アソシエーション）していきます。

左メニューから「Transit Gateway ルートテーブル」を選択し、前段で作成したルートテーブルの「関連付け」タブから「関連付けを作成」をクリック。
![Top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/41e02740-d669-c163-da5f-ed4371c90e10.png)

「関連付けるアタッチメントを選択」で先程作成したアタッチメントを指定したら、「関連付けを作成」をクリック。
![Create1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/182b0727-9160-ae62-545b-1f8966a38fbb.png)
これを関連付けたいアタッチメントの数だけ繰り返します。
全ての関連付けの状態が Associated に変わったら次へ進みます。

### プロパゲーション（伝播）の作成
ここまででアタッチメントしたVPCから、Transit Gateway ルートテーブルへ経路情報をプロパゲーションします。
左メニューから「Transit Gateway ルートテーブル」を選択し、ルートテーブルの「伝播」タブから「伝達を作成」をクリック。（※表記が揺れていますが実際の画面通りです。）

![Top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/840b9eb2-cf82-b738-2960-562722f81d27.png)

「伝達するアタッチメントを選択」欄で作成済みのアタッチメントを指定して、「伝達を作成」をクリック。
![Create.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/3cd138b8-6c04-b61d-d4ce-cec096a5a370.png)
アソシエーション同様、プロパゲーションしたいアタッチメントの数だけ繰り返します。

これでTransit Gateway側の作業は完了です。
全ての伝播の状態が Enabled に変わったら、「ルート」タブに以下のように伝達済みの経路が追加されています。
![Create3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/8f506613-0d1e-7b56-6c01-4487cec4006d.png)


### 各サブネットのルートテーブルへ経路情報を追加
Transit Gatewayを作成し、各VPCへの経路情報はTransit Gateway ルートテーブルに伝播されました。
あとは通信したい各VPCのルートテーブルに、互いのVPC宛ての通信をTransit Gatewayに向けるような経路を追加してあげましょう。

現在ピアリング接続宛てになっている「172.17.0.0/16」宛ての通信を、作成済みのTransit Gateway アタッチメント宛てに変更します。
![Edit.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/da137ea4-6247-f2d6-0c13-bcb5024bf6b5.png)
![Edit2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519209/7a973396-0daf-e742-72a6-5d6eb1a0c8af.png)

もう一方のVPC側では逆向き（「172.16.0.0/16」宛てをTransit Gateway アタッチメント宛て）に変更します。

### 完成！
これで設定完了です。
※セキュリティグループの設定はピアリング接続時から変更していませんので割愛

実際に構成図の左側のVPCに起動したインスタンスから右側のVPCに起動したインスタンスへ接続確認してみましょう。

```ruby:my-vpc-01
[ec2-user@ip-172-16-10-230 ~]$ ping -c 3 172.17.20.59
PING 172.17.20.59 (172.17.20.59) 56(84) bytes of data.
64 bytes from 172.17.20.59: icmp_seq=1 ttl=63 time=3.17 ms
64 bytes from 172.17.20.59: icmp_seq=2 ttl=63 time=2.10 ms
64 bytes from 172.17.20.59: icmp_seq=3 ttl=63 time=2.18 ms

--- 172.17.20.59 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 2.109/2.489/3.176/0.489 ms
[ec2-user@ip-172-16-10-230 ~]$
[ec2-user@ip-172-16-10-230 ~]$
[ec2-user@ip-172-16-10-230 ~]$ ssh -i  〓鍵ファイル〓 172.17.20.59
Last login: Mon Jan 31 15:52:25 2022 from 172.16.10.230

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-17-20-59 ~]$
```

以上、非常にシンプルな構成でのピアリング接続からTransit Gatewayへの移行でした。

Transit Gatewayはピアリング接続と比較すると、1対1のVPC間の接続においては設定項目も多く、コストメリットもありません。

しかし、「相互に接続したいVPCの数が多い」「各VPCからオンプレミス環境へVPN接続したい」といった場合には力を発揮してくれます。
（※それでもアタッチメントあたりでコストがかかるのでコストだけの比較だと高く上がりますが、相互接続するVPCが数十単位になると設定作業の手間は段違いです。）


次回は、Transit Gatewayを利用してアウトバウンドのインターネット接続を一つのVPCに集約してみようと思います。