【オンプレからクラウド移行】３つのVPCをTransit GatewayでつないでPingさせてみた【AWS】

最近１つの現場が終わりまして、次の現場の面談を多く受けていました。その中で多かったのがオンプレからクラウド移行の案件、もしくは他の環境を移行する案件がありました。

ここしばらくオンプレからクラウド移行の案件、もしくはハイブリッドな環境を構築する案件にまた当たった時に色々問われるだろうと思い、クラウド移行について調べていました。

ちょっと調べてみるとすぐに出てくるのがDirectConnectとTransit Gatewayです。

DirectConnectについては業者が作業をしてくれるらしいのですが、SEがコンソール画面から作業する必要があるのはTransit Gateway。

オンプレとクラウドのネットワークをつなぐ際にどのような役割、メリットがあるのか、そしてメインの機能である複数のVPCを接続ができるか実際に試してみました。

# Transit Gatewayとは
VPCとオンプレのネットワークを中央ハブで接続して数千のVPC、VPN、ダイレクトコネクトを接続可能にし複雑なルーティングを簡素化してくれる。

これまでは複数のVPCをつなぐときはピアリングを使って迂回しないといけないネットワークだったのが

Transit Gatewayが中央ハブの役割をするルーターの役割をしてくれるのでごちゃごちゃとしたピアリング接続をしなくてもよくなる。

VPCを複数接続させること以外にもマルチアカウントで使えるリージョン間のピアリング接続、ネットワーク変更、ルート変更、接続ステータス更新の通知受けるメトリクス機能などがある。

サクっとおさらいをしたところで、、

# VPCを作成
[VPC]-[VPCを作成]

![スクリーンショット 2022-11-08 9.15.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/7c972278-b4c2-8777-c10c-30c1e6f6c867.png)



VPCを３つ作成しました。[プロジェクト-VPC]は今回の記事では使用しないので無視します。

# Transit Gatewayを作成
[VPC]-[Transitgateway]

![スクリーンショット 2022-11-04 20.21.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/4101031e-d965-fc79-0175-d0dedf459460.png)


[Transitgatewayを設定]のデフォルトテーブルの関連付け、デフォルトテーブルの関連付けにチェックを入れておきます。

チェックを入れておくことで作成した後、アタッチメントをした時に自動でルートテーブルの関連付けとデフォルトルートテーブルの伝播まで行ってくれます。

補足：Transit Gatewayルートテーブルは通常のルートテーブルとは違います。Transit Gatewayが他のVPCと接続をするためのルートテーブルです。そのため操作はTransit Gatewayルートテーブルで行います。

それぞれの設定項目について記載します。


### ●Amazon 側の自律システム番号 (ASN)
　BGPセッションのAWS側の自立システム番号（ASN）のことを指します。
　・ASNとは
　　インターネットは１つのネットワークではなく複数のネットワークでできています。それぞれの小さなネットワークがASといい、それらに世界で被らない識別番号がASNといいます。

### ●DNS番号
　Transit Gateway にアタッチされた VPC DNS解決を有効にします。パブリック IPv4 DNS ホスト名（EC2）をプライベート IPv4 アドレスに解決するために VPCが必要な場合は、[有効] を選択します。EC2の名前解決版と行ったところでしょうか。

### ●VPN ECMP サポート
　接続が同じ CIDR をアドバタイズ（告知）する場合、トラフィックは複数の接続間で均等に分散されるルーティングプロトコルのことを指します。

### ●デフォルトルートテーブルの関連付け
　VPCを指定したTransit Gatewayにアタッチさせるとルートテーブルを自動的に紐付けます。

### ●デフォルトルートテーブルの伝播
　上記と同じでアタッチさせると自動的に伝播してくれます。

### ●マルチキャストサポート
　マルチキャストトラフィックのルーターとして使用したい場合に選択します。（トラフィックを複数のグループにフラッディングさせます）

### ●クロスアカウント共有オプションの設定
　他のアカウントのアタッチメントを自動的に承諾します。



![スクリーンショット 2022-11-08 12.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/802988c2-2a31-1c8c-4ec1-661f5d19b12d.png)


それぞれ設定し、Transit Gatewayの作成を完了させると状態がAvailableになっていれば良いです。

続けて作成したVPCをTransit Gatewayにアタッチさせます。



# VPCをアタッチメントさせる
[VPC]-[Transit Gateway]-[Transit Gateway アタッチメント]

![スクリーンショット 2022-11-04 20.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/14eb6780-5111-c7e2-05e5-091cb670d974.png)

作成したTransit Gateway IDを選択します。

![スクリーンショット 2022-11-08 12.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/5c9e9094-9d1b-fc75-cf28-511e782581dd.png)

アタッチするVPC IDを選択して対象のサブネットIDを選択します。こちらのアタッチメントを行うと・・・

![スクリーンショット 2022-11-08 13.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/7275dabf-9729-fdcb-3c6d-0efaa8258a8f.png)

状態がAvailableになれば、関連付けルートテーブルIDに自動的にルートテーブルが紐付きます。この要領で残り２つのVPCのアタッチメントを作成しルートテーブルに紐付けていきます。

２つのVPCをアタッチさせた後、どのようにルートテーブルに紐づいているか見てみましょう。
[VPC]-[Transit Gateway]-[Transit Gateway ルートテーブル]


![スクリーンショット 2022-11-08 13.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/76d58f89-8b08-96a8-9ce8-483fc5a29c2e.png)

先ほどのVPCが関連づけられているのかがわかります。

![スクリーンショット 2022-11-08 13.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/feced818-15ed-2460-cd41-65d03d743017.png)

伝播が済んでいるのがわかります。

![スクリーンショット 2022-11-08 13.51.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/0d202c76-9b9e-83be-5b96-fa6739727d62.png)

ルートテーブルにもルートが記載されていることがわかります。

話が横道に逸れますがTransit gatewayのVPC接続の仕組みを簡単に説明します。（参照記事にも記載あり）

# VPC接続の仕組み

### アタッチメント
VPCとTransit Gatewayはそれぞれ独立したサービスなのでアタッチ（接続）させる必要があります。こちらの作業は[Transit gateway アタッチメント]から行います。

### アソシエーション
先ほどTransit Gatewayに接続したVPCをTransit Gatewayルートテーブルに紐付ける作業です。

### プロパゲーション

VPCからルートテーブルに経路を伝播します。
伝播というのは少々難しいのですが、普及、つながらせる、伝わらせる。といった意味です。クラスメソッドさんの記事の画像だとルートテーブルのルート情報が使えるようになるとイメージでしょうか。気になる方はぜひ読んでみてください。

整理すると、、、
**①アタッチメントで独立しているVPCとTransit gatewayを接続**
**②アソシエーションで指定のルートテーブルと紐付ける**
**③プロパゲーションでルートテーブルに記載されているルート情報を使用することができる**

というような流れです。

ちなみにアソシエーションとプロパゲーションはTransit Gatewayを作成した時にデフォルトテーブルの関連付け、デフォルトテーブルの関連付けにチェックを入れとくとアタッチメントを行った時に自動で行われます。

# サブネットにルートテーブルを紐付ける
先ほどのTransit GatewayルートテーブルはTransit Gatewayから各VPCへルートを作成しました。

今度はあるVPC-AがVPC-Bにトラフィックを送る際にTransit Gatewayへ向かうためのルートを作成します。

[VPC]-[サブネット]-[任意のサブネット]-[ルートテーブル]
任意のルートテーブルIDをコピーし
[VPC]-[ルートテーブル]に移動してルートテーブルを検索します。[ルートを編集]をクリックして送信先をそれぞれのVPCのCIDRをいれていきます。

ターゲットはそのVPCに送った時にTransit Gatewayを経由するように設定します。そのためVPC-Aの場合（10.0.0.0/16の場合）このように設定します。![スクリーンショット 2022-11-08 19.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/2480f4fe-2216-d65a-dbb5-d241c6011219.png)

続いてVPC-B(10.1.0.0/24の場合)の場合、このように設定します。
![スクリーンショット 2022-11-08 21.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/8cbe1ca5-0973-eed9-c2a3-5357508ed1e1.png)

最後にVPC-C(10.2.0.0/24の場合)の場合、このように設定します。

![スクリーンショット 2022-11-08 21.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/6888c05e-ce9b-065b-03bd-71b54624b1c2.png)

これでそれぞれのVPCからトラフィックを送ってもTransit Gatewayに向かうように設定ができました。

続いてEC2を立ててpingを送ります。そのためセキュリティグループを作成します。（EC2を立てる工程は省きます。）

# セキュリティグループを作成

VPC-A(10.0.0.0/16の場合）に立てているEC2のセキュリティグループ
![スクリーンショット 2022-11-08 21.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/572bce2f-ffb4-d1be-1a54-a3050a6a5433.png)

10.1.0.0/16と10.2.0.0/16のインバウンドルールが設定されていればOKです。

VPC-A(10.1.0.0/16の場合）に立てているEC2のセキュリティグループ
![スクリーンショット 2022-11-08 21.51.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/742e5c70-0775-6292-4f21-e15968f51832.png)

10.0.0.0/16と10.2.0.0/16のインバウンドルールが設定されていればOKです。


VPC-A(10.2.0.0/16の場合）に立てているEC2のセキュリティグループ
![スクリーンショット 2022-11-08 21.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/151345f7-7b1f-6da4-6feb-485d2fb40ada.png)

10.0.0.0/16と10.1.0.0/16のインバウンドルールが設定されていればOKです。

これでpingを飛ばして疎通する体制が整いました。それではターミナルから打ってみましょう。（EC2を立てる工程は省きます。）　


# ターミナルからpingを飛ばす
まずはキーペアを使ってEC2に入るための準備を行います。EC2を作成した時にキーペアをデスクトップに置いておきます。

```
cd Desktop
```
まずはキーペアを置いているデスクトップに移動します。
```
chmod 600 Sample01.pem 
```
キーペアを使用するパーミッション（権限）を変更します。600なので読み込みと書き込みが可能にします。
```
ssh -i Sample01.pem ec2-user@13.112.157.166
```
SSHコマンドを入力してSSH接続を行います。@は接続先になるのでEC2のパブリックIPをいれます。
![スクリーンショット 2022-11-08 22.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/2484c891-fbf1-503d-57d8-bc316321fe17.png)

そうするとAmazon Linux 2 AMIの表示がされれば成功です。SSH接続はパブリックIPで行いましたがプライベートIPで表示されます（赤枠で囲まれている）

それではpingを行います。
10.0.0.0に設置しているEC2から10.1.0.0と10.2.0.0に設置しているEC2に向けてpingを飛ばします。
![スクリーンショット 2022-11-08 22.40.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/602e398e-4ee6-5342-d88a-8d9f7dbcaef9.png)

これで疎通していることが確認できました。一応これでVPCをまたいで通信ができることが確認できます。

しかし本当にやりたかったことはEC2からまた別のVPCのEC2に移動しpingを飛ばしたかったのですがあいにく時間の都合とAWSのコスト面で終わりたいと思います。


## 他にもこんな記事書いています！
https://qiita.com/mmurm/items/c5c8b1328e8864144c26

https://qiita.com/mmurm/items/1d42ab3d47dd85e4efbd

## 参考にした記事
Transit Gateway

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/tgw-transit-gateways.html#create-tgw

AS番号

https://wa3.i-3-i.info/word12229.html

Transit Gatewayを利用してVPC間で通信してみた

https://dev.classmethod.jp/articles/transit-gateway-vpc/

AWS EC2インスタンスへSSH接続する方法 ( Mac )

https://utubou-tech.com/mac-ec2-ssh/