2つのVPCをTransit Gatewayで接続する

# はじめに

ここで作成するのは、既存の以下のような2つのVPCを Transit Gateway で結ぶ構成です。
Single AZ 間での構成例になります。

![Transit Gateway Basic (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/e0d06256-9633-3843-6e34-7e0d7f4a7a1c.png)

ここでは、Private Subnet 間で通信が可能になる構成を作成します。

# Transit Gateway を作成する

### 下準備

VPC ID を取得します。

```
$ aws ec2 describe-vpcs | jq -r '.Vpcs[] | [.CidrBlock, .VpcId] | @csv'
"10.7.0.0/16","vpc-0e403f03014e706c3"
"10.8.0.0/16","vpc-08e6b9ecd4e90c949"
$ 
```

VPC ID を変数にセットします。

```
export VPC_ID_1=vpc-08e6b9ecd4e90c949 # 10.8.0.0/16 側
export VPC_ID_2=vpc-0e403f03014e706c3 # 10.7.0.0/16 側
```

両方の VPC の Private Subnet の id を調べます。

```
$  aws ec2 describe-subnets | jq -r '.Subnets[] | [ .CidrBlock, .SubnetId, .AvailabilityZone, .Tags[].Value ] | @csv'
"10.8.128.0/17","subnet-0d1224192eb265726","ap-northeast-1c","my-public"
"10.7.128.0/17","subnet-0a2360ce9dca34f9d","ap-northeast-1d","shared","my-public"
"10.7.0.0/17","subnet-03a000478bacb81f6","ap-northeast-1d","my-private","shared"
"10.8.0.0/17","subnet-0a4ecb7a715715c60","ap-northeast-1c","my-private"
$ 
```

Private Subent の ID を変数にセットします。

```
export VPC1_PRIVATE_SUBNET=subnet-0a4ecb7a715715c60  # 10.8.0.0/16 側
export VPC2_PRIVATE_SUBNET=subnet-03a000478bacb81f6  # 10.7.0.0/16 側
```

### Transit Gateway / Transit Gateway Attachment の作成

Transit Gateway を作成します。

```
$ T_GW=`aws ec2 create-transit-gateway | jq -r .TransitGateway.TransitGatewayId`

# わかり易いようにタグを付けておく
$ aws ec2 create-tags --resources $T_GW --tags Key=Name,Value=my-transit-gateway

```

Transit Gateway Attachment を作成して、Trasit Gateway と VPC1 の Private サブネットに関連付けします。

```
$ T_GW_A_VPC1=`aws ec2 create-transit-gateway-vpc-attachment --transit-gateway-id $T_GW --vpc-id $VPC_ID_1 --subnet-ids $VPC1_PRIVATE_SUBNET | jq -r .TransitGatewayVpcAttachment.TransitGatewayAttachmentId`

# 名前を付けておく (Key=Name)
$ aws ec2 create-tags --resources $T_GW_A_VPC1 --tags Key=Name,Value=transit-gw-attachment-vpc1
```

Attachement 2 を VPC2に作成して、Trasit Gateway と VPC2 の Private Subnet に 関連付け

```
$ T_GW_A_VPC2=`aws ec2 create-transit-gateway-vpc-attachment --transit-gateway-id $T_GW --vpc-id $VPC_ID_2 --subnet-ids $VPC2_PRIVATE_SUBNET | jq -r .TransitGatewayVpcAttachment.TransitGatewayAttachmentId`

# 名前を付けておく (Key=Name)
$ aws ec2 create-tags --resources $T_GW_A_VPC2 --tags Key=Name,Value=transit-gw-attachment-vpc2
```

Transit Gateway の Route table Id を取得

```
$ T_GW_D_RT=`aws ec2 describe-transit-gateways --transit-gateway-id $T_GW | jq -r '.TransitGateways | .[] | .Options.AssociationDefaultRouteTableId'`

# 名前を付けておく (Key=Name)
$ aws ec2 create-tags --resources $T_GW_D_RT --tags Key=Name,Value=transit-gw-route-table
```

## Route Table への Route の追加

両方の VPC の Private Subnet の Route Table に、お互いの Private Subnet への Route を追加します。

![Transit Gateway Basic 2 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/d272a203-f946-9d70-efbd-b63ea1b258fd.png)


### 下準備
両方の VPC の Private Subnet の ID を調べます。

前の手順より、
VPC1 の Private Subnet ID は、`subnet-0a4ecb7a715715c60`
VPC2 の Private Subnet ID は、`subnet-03a000478bacb81f6`
です。この情報からどの行が、Private Subnet の Route Table の情報か判別できます。

```
$ aws ec2 describe-route-tables | jq -r '.RouteTables[] | [ .RouteTableId, .VpcId, .Associations[].SubnetId ] | @csv'
"rtb-0c9934afb03c1c4e9","vpc-08e6b9ecd4e90c949","subnet-0a4ecb7a715715c60"  # VPC1 側 Private Subnet
"rtb-027c33000a9e9d2b2","vpc-08e6b9ecd4e90c949","subnet-0d1224192eb265726"
"rtb-04ab084be4886aa6e","vpc-0eb1b5687d2d71353","subnet-06014a65bd1377f0a"
"rtb-06d5b8fd3ed943371","vpc-0eb1b5687d2d71353","subnet-0261cabed9465687a"
"rtb-01d6d53fe26411781","vpc-0e403f03014e706c3","subnet-0a2360ce9dca34f9d"
"rtb-0cde2c29f42ae4baf","vpc-0e403f03014e706c3","subnet-03a000478bacb81f6" # VPC2 側 Private Subnet
$ 
```




Private Subnet の Route Table id を変数にセットします。

```
export VPC1_PRV_SUB_R_TABLE=rtb-0c9934afb03c1c4e9
export VPC2_PRV_SUB_R_TABLE=rtb-0cde2c29f42ae4baf
```

VPC1 と VPC2 の CIDR　も変数にセットしておきます。

```
export VPC1_CIDR="10.8.0.0/16"
export VPC2_CIDR="10.7.0.0/16"
```

### Route Table への Route の追加
VPC1 の Private Subnet の Route Table に VPC2 への Route として Transit Gateway への Route を追加

```
$ aws ec2 create-route --route-table-id $VPC1_PRV_SUB_R_TABLE --destination-cidr-block $VPC2_CIDR --gateway-id $T_GW
```

VPC2 の Private Subnet の Route Table に VPC1 への Route として Transit Gateway への Route 追加

```
$ aws ec2 create-route --route-table-id $VPC2_PRV_SUB_R_TABLE --destination-cidr-block $VPC1_CIDR --gateway-id $T_GW
```

以上で Transit Gateway の基本的な構成は完了です。お互いの Private Subnet から、相手の Private Subnet に通信が可能になります。

# VPC1 の Private Subnet から VPC2の Public Subnet への通信の設定

要件によっては、さらに Route Table に Route を追加する必要があります。
ここでは、以下の赤い線の通信が可能なように Route Table に Route を追加してみます。

![Copy of Transit Gateway Basic 3 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/aae95fc3-431a-37b3-037b-a4e52b96fc68.png)

VPC1 の Private Subnet → VPC2 の Private Subnet → VPC2 のPublic Subnet というルートは存在しますが、そこまでパケットが辿り着いたとします。その後、VPC2 の Public Subnet から戻りのルートを考えると、VPC1 の Private Subnet への戻りのルートがわかりません。

これを可能にするためには、VPC2 の Public Subnet の Route Table に VPC1 の Private Subnet へのルートを追加します。

## 準備

Route Table の一覧の情報を出力します。

```
$ aws ec2 describe-route-tables | jq -r '.RouteTables[] | [ .RouteTableId, .VpcId, .Associations[].SubnetId ] | @csv'
"rtb-0c9934afb03c1c4e9","vpc-08e6b9ecd4e90c949","subnet-0a4ecb7a715715c60"  # VPC1 側 Private Subnet
"rtb-027c33000a9e9d2b2","vpc-08e6b9ecd4e90c949","subnet-0d1224192eb265726"
"rtb-04ab084be4886aa6e","vpc-0eb1b5687d2d71353","subnet-06014a65bd1377f0a"
"rtb-06d5b8fd3ed943371","vpc-0eb1b5687d2d71353","subnet-0261cabed9465687a"
"rtb-01d6d53fe26411781","vpc-0e403f03014e706c3","subnet-0a2360ce9dca34f9d" # <= VPC2 側 Public Subnet
"rtb-0cde2c29f42ae4baf","vpc-0e403f03014e706c3","subnet-03a000478bacb81f6" # VPC2 側 Private Subnet
$ 
```

以前の作業から、VPC2 の Private Subnet は分かっているので、VPC2の Public Subnetもすぐにわかります。

変数に VPC2の Public Route Table の IDをセットします。

```
export VPC2_PUB_SUB_R_TABLE=rtb-01d6d53fe26411781
```

## ルートの追加

VPC2 の Public Subnet の Route Table に VPC1 への Route として Transit Gateway への Route 追加します。

```
$ aws ec2 create-route --route-table-id $VPC2_PUB_SUB_R_TABLE --destination-cidr-block $VPC1_CIDR --gateway-id $T_GW
```

以上で完了です。