はじめに
ここで作成するのは、既存の以下のような2つのVPCを Transit Gateway で結ぶ構成です。
Single AZ 間での構成例になります。
ここでは、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 を追加します。
下準備
両方の 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 を追加してみます。
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
以上で完了です。