Transit Gateway inter-Region Peering を試してみる

2019年12月のre:Inventにて、リージョン間のTrasit Gatewayピアリング機能が発表されました。

__AWS Transit Gatewayにマルチキャストとインターリージョンピアリング機能を追加__
https://aws.amazon.com/jp/blogs/news/aws-transit-gateway-adds-multicast-and-inter-regional-peering/

２つのリージョンを Transit Gateway で接続し、それぞれリージョンのEC2間で簡単な通信のテストをします


# 参考資料

__[AWS Black Belt Online Seminar] AWS Transit Gateway 資料及び QA 公開__
https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-transit-gateway-2019/

__Transit Gateway Peering Attachments__
https://docs.aws.amazon.com/vpc/latest/tgw/tgw-peering.html

__Transit Gateway Example: Peering__
https://docs.aws.amazon.com/vpc/latest/tgw/transit-gateway-peering-scenario.html

__Transit Gateway Deep Dive アーキテクチャガイド__
https://pages.awscloud.com/rs/112-TZM-766/images/B1-05.pdf

# 構成

Blackbeltの資料を元に、Transit Gateway のアタッチメントENIに専用サブネットを作ります。
いたってシンプルな構成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/595d9b7c-9d16-0e79-fccc-84e707d9e13c.png)

|-|-|
|:---|:---|
|リージョン|バージニア北部/us-east-1|
|CIDR|10.1.0.0/16|
|private subnet 1|10.1.11.0/24|
|private subnet 2|10.1.12.0/24|
|アタッチメントENI専用サブネット|10.1.255.0/28|
|アタッチメントENI専用サブネット|10.1.255.16/28|

|-|-|
|:---|:---|
|リージョン|オハイオ/us-east-2|
|CIDR|10.2.0.0/16|
|private subnet 1|10.2.11.0/24|
|private subnet 2|10.2.11.0/24|
|アタッチメントENI専用サブネット|10.2.255.0/28|
|アタッチメントENI専用サブネット|10.2.255.16/28|


# 手順
## VPCとEC2の作成
これはごく一般的なものだと思うので、割愛します。

## 各リージョンで Transit Gateway を作成

公式ドキュメントにて、将来的にルート伝搬機能を利用するために、一意のASNを使用することを推奨しているので、重複しないように作ります。

https://docs.aws.amazon.com/vpc/latest/tgw/tgw-peering.html
> We recommend using unique ASNs for the peered transit gateways to take advantage of future route propagation capabilities.

今回は、以下のようにしました。

|リージョン|ASN|
|:---|:---|
|バージニア|64512|
|オハイオ|64513|

__バージニア__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/c36c58d2-c974-06cc-6476-bb91826dc2e8.png)

__オハイオ__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/f886c0e3-2488-5319-76ea-e33f485e8a50.png)


## Transit Gateway のアタッチメントを作成
2種類のアタッチメントを作成します

- VPC アタッチメント
- Peering アタッチメント

### VPC アタッチメントの作成

アタッチメントを作成するサブネットは、専用に用意したサブネットを利用します。

バージニア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/5d8ba740-48ba-7c3e-7728-d3d6b8fae55a.png)

オハイオ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/414c81d5-7125-9a75-cfb4-c10851a66149.png)

### Peering アタッチメントを作成
バージニアで、オハイオリージョンの Transit Gateway ID を指定して peering します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/6f7242ca-1d44-5e0a-6a1b-06c1d3fde87e.png)

State が "initiating request" となるので、オハイオ側で承認の必要があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/4a96457d-f14b-b79e-5fc0-043eaed3048f.png)

リージョンをオハイオに切り替えて で Accept します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/b31a8639-5136-fb8b-ff69-be51ca3c5dbe.png)

## Transit Gateway のルートテーブル

###アソシエート
各リージョンで VPC,Peering のアタッチメントをアソシエートします

バージニア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/9ac5341b-eed8-4158-17e1-fa36b3d4eeb3.png)

オハイオ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/a1c918ab-5786-4268-c5e2-6c50c434d8e3.png)

###プロパゲート
各リージョンで VPC のアタッチメントをプロパゲートします。
Peering用のアタッチメントはプロパゲートできないので、次の手順で手動で経路設定します。

バージニア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/7faf334e-1a12-a1f7-439a-cca51551dbea.png)

オハイオ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/57ce4330-0c76-8b50-648c-956a22a8d7d0.png)


###経路の作成
バージニアで、__10.2.0.0/16__ の経路を Peering アタッチメントに向けます
オハイオで、__10.1.0.0/16__ の経路を Peering アタッチメントに向けます

バージニア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/b3a6268a-edc3-91cf-f189-a388b4ba4e2c.png)


オハイオ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/928cb03c-a9c4-850f-e217-fe011fa5f1b8.png)

## VPCルートテーブル変更
各リージョンのサブネットのルートテーブルに Transit Gateway に向ける経路を書きます

バージニアで、__10.2.0.0/16__ の経路を Transit Gateway に向けます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/c5bc363e-22fb-319e-5141-8824bfb60e30.png)

オハイオで、__10.1.0.0/16__ の経路を Transit Gateway に向けます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/c9b07a66-306e-ce91-bed9-a24e00cb4e0f.png)



# 確認

一通り設定が終わったので確認
バージニアのEC2から、オハイオのEC2へ ping

```bash
[ec2-user@ip-10-1-11-100 bin]$ ping 10.2.12.100
PING 10.2.12.100 (10.2.12.100) 56(84) bytes of data.
64 bytes from 10.2.12.100: icmp_seq=1 ttl=253 time=13.6 ms
64 bytes from 10.2.12.100: icmp_seq=2 ttl=253 time=12.6 ms
64 bytes from 10.2.12.100: icmp_seq=3 ttl=253 time=12.7 ms
64 bytes from 10.2.12.100: icmp_seq=4 ttl=253 time=12.6 ms
64 bytes from 10.2.12.100: icmp_seq=5 ttl=253 time=12.6 ms
```

#気づき
- ASN は将来のことを考え分けとく
    - https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/tgw-peering.html
    - We recommend using unique ASNs for the peered transit gateways to take advantage of future route propagation capabilities.
- アタッチメント、ルートテーブル、アソシエート、プロパゲート、スタティックルート の５つをしっかり理解していれば、難しくない。VPC同士をつなぐ場合と手順的にさほど変わらない。
- peering 用アタッチメントは片方のリージョンでリクエスト投げて、承認されれば両方にできあがる