こんにちは、技術4課の城です。
先日、トランジットゲートウェイが東京リージョンにもリリースされました。
というわけで、私も触ってみました。「AWS CLI」で。
備忘も兼ねて、手順を紹介させていただきます。
概要
172.16.0.0/16、172.17.0.0/16の2つのVPCを用意し、トランジットゲートウェイ経由で疎通させてみます。
※VPC等の準備については割愛しています。
AWS CLIのアップデート
AWS CLIをアップデートします。
$ sudo pip install -U awscli
バージョン確認
12/16 時点では 1.16.76
でした。
【コマンド】
aws --version
【結果例】
aws-cli/1.16.76 Python/3.5.2 Linux/4.4.0-17134-Microsoft botocore/1.12.66
プロファイルの設定
利用するプロファイルに変更します。
IAMロールやIAMユーザーで利用している方は本項目をスキップしてください。
【コマンド】
export AWS_DEFAULT_PROFILE=【利用するプロファイル名】
トランジットゲートウェイの作成
変数の設定
【コマンド】
TRANSIT_GW_DESC='for test on 20181216'
変数の確認
【コマンド】
cat << ETX
TRANSIT_GW_DESC: ${TRANSIT_GW_DESC}
ETX
【結果例】
TRANSIT_GW_DESC: for test on 20181216
トランジットゲートウェイの作成
【コマンド】
aws ec2 create-transit-gateway \
--description "${TRANSIT_GW_DESC}" \
| tee create-transit-gw-result.json
【結果例】
{
"TransitGateway": {
"State": "pending",
"OwnerId": "************",
"CreationTime": "2018-12-16T12:20:33.000Z",
"TransitGatewayId": "tgw-06273aae66096e98a",
"Description": "for test on 20181216",
"Options": {
"DefaultRouteTableAssociation": "enable",
"VpnEcmpSupport": "enable",
"AssociationDefaultRouteTableId": "tgw-rtb-0c6aecb37236d32d7",
"AmazonSideAsn": 64512,
"DefaultRouteTablePropagation": "enable",
"PropagationDefaultRouteTableId": "tgw-rtb-0c6aecb37236d32d7",
"AutoAcceptSharedAttachments": "disable",
"DnsSupport": "enable"
},
"TransitGatewayArn": "arn:aws:ec2:ap-northeast-1:************:transit-gateway/tgw-06273aae66096e98a"
}
}
※今回はデフォルトにて作成しましたが–optionsにて詳細パラメーター(結果のOptionsの項目)を指定することが可能です。
トランジットゲートウェイIDの取得
【コマンド】
TRANSIT_GW_ID=$( \
jp.py -f create-transit-gw-result.json \
'TransitGateway.TransitGatewayId' \
| sed -e "s/\"//g" \
) \
&& echo ${TRANSIT_GW_ID}
【結果例】
tgw-013b4414f3e1f9752
トランジットゲートウェイのアタッチ
VPC IDの取得
アタッチするVPCのIDが必要なため取得します。
変数の設定
各VPCのネットワークCIDRを設定します。
VPC_CIDR01='172.16.0.0/16'
VPC_CIDR02='172.17.0.0/16'
VPC IDの取得
【コマンド】
VPC_ID01=$( \
aws ec2 describe-vpcs \
--filters Name=cidr,Values=${VPC_CIDR01} \
--query 'Vpcs[].VpcId' \
--output text \
) \
&& echo ${VPC_ID01}
VPC_ID02=$( \
aws ec2 describe-vpcs \
--filters Name=cidr,Values=${VPC_CIDR02} \
--query 'Vpcs[].VpcId' \
--output text \
) \
&& echo ${VPC_ID02}
【結果例】
vpc-04ff85daf466a2497
vpc-0f99a9e9ce6475e1f
サブネットIDの取得
アタッチするサブネットのIDが必要なため取得します。
変数の設定
各VPCのネットワークCIDRを設定します。
【コマンド】
VPC_SUBNET_CIDR01='172.16.0.0/24'
VPC_SUBNET_CIDR02='172.17.0.0/24'
サブネットIDの取得
【コマンド】
VPC_SUBNET_ID01=$( \
aws ec2 describe-subnets \
--filters Name=cidrBlock,Values=${VPC_SUBNET_CIDR01} \
--query 'Subnets[].SubnetId' \
--output text \
) \
&& echo ${VPC_SUBNET_ID01}
VPC_SUBNET_ID02=$( \
aws ec2 describe-subnets \
--filters Name=cidrBlock,Values=${VPC_SUBNET_CIDR02} \
--query 'Subnets[].SubnetId' \
--output text \
) \
&& echo ${VPC_SUBNET_ID02}
【結果例】
subnet-07c2fbaa545b89e9f
subnet-0b8d6b9df5471a503
変数の確認
【コマンド】
cat << ETX
TRANSIT_GW_ID: ${TRANSIT_GW_ID}
VPC_ID01: ${VPC_ID01}
VPC_ID02: ${VPC_ID02}
VPC_SUBNET_ID01: ${VPC_SUBNET_ID01}
VPC_SUBNET_ID02: ${VPC_SUBNET_ID02}
ETX
【結果例】
TRANSIT_GW_ID: tgw-06273aae66096e98a
VPC_ID01: vpc-04ff85daf466a2497
VPC_ID02: vpc-0f99a9e9ce6475e1f
VPC_SUBNET_ID01: subnet-07c2fbaa545b89e9f
VPC_SUBNET_ID02: subnet-0b8d6b9df5471a503
トランジットゲートウェイのアタッチ
それぞれのVPCに対しアタッチメントを作成することでアタッチされます。
【コマンド】
aws ec2 create-transit-gateway-vpc-attachment \
--transit-gateway-id ${TRANSIT_GW_ID} \
--vpc-id ${VPC_ID01} \
--subnet-ids ${VPC_SUBNET_ID01} \
| tee create-transit-gw-atatthment01.json
【結果例】
{
"TransitGatewayVpcAttachment": {
"VpcOwnerId": "************",
"SubnetIds": [
"subnet-07c2fbaa545b89e9f"
],
"VpcId": "vpc-04ff85daf466a2497",
"TransitGatewayId": "tgw-06273aae66096e98a",
"CreationTime": "2018-12-16T12:40:53.000Z",
"Options": {
"DnsSupport": "enable",
"Ipv6Support": "disable"
},
"TransitGatewayAttachmentId": "tgw-attach-0d85e66ca886d25f3",
"State": "pending"
}
}
【コマンド】
aws ec2 create-transit-gateway-vpc-attachment \
--transit-gateway-id ${TRANSIT_GW_ID} \
--vpc-id ${VPC_ID02} \
--subnet-ids ${VPC_SUBNET_ID02} \
| tee create-transit-gw-atatthment02.json
【結果例】
{
"TransitGatewayVpcAttachment": {
"SubnetIds": [
"subnet-0b8d6b9df5471a503"
],
"Options": {
"DnsSupport": "enable",
"Ipv6Support": "disable"
},
"CreationTime": "2018-12-16T12:42:14.000Z",
"VpcId": "vpc-0f99a9e9ce6475e1f",
"State": "pending",
"TransitGatewayId": "tgw-06273aae66096e98a",
"TransitGatewayAttachmentId": "tgw-attach-0e774a432cdb6207e",
"VpcOwnerId": "************"
}
}
※出力結果をファイルとして保存するのは後ほど削除するのにIDが必要なためです。
ルートテーブルへのルート追加
各サブネットに紐づいているルートテーブルにルートを追加します。
ルートテーブルIDの取得
【コマンド】
ROUTE_TABLE_ID01=$( \
aws ec2 describe-route-tables \
--filters Name=association.subnet-id,Values=${VPC_SUBNET_ID01} \
--query 'RouteTables[].Associations[].RouteTableId' \
--output text \
) \
&& echo ${ROUTE_TABLE_ID01}
ROUTE_TABLE_ID02=$( \
aws ec2 describe-route-tables \
--filters Name=association.subnet-id,Values=${VPC_SUBNET_ID02} \
--query 'RouteTables[].Associations[].RouteTableId' \
--output text \
) \
&& echo ${ROUTE_TABLE_ID02}
【結果例】
rtb-08a496d3d59856054
rtb-0ef2bcaab0bd6e506
変数の確認
【コマンド】
cat << ETX
TRANSIT_GW_ID: ${TRANSIT_GW_ID}
VPC_ID01: ${VPC_ID01}
VPC_ID02: ${VPC_ID02}
ROUTE_TABLE_ID01: ${ROUTE_TABLE_ID01}
ROUTE_TABLE_ID02: ${ROUTE_TABLE_ID02}
ETX
【結果例】
TRANSIT_GW_ID: tgw-06273aae66096e98a
VPC_ID01: vpc-04ff85daf466a2497
VPC_ID02: vpc-0f99a9e9ce6475e1f
ROUTE_TABLE_ID01: rtb-08a496d3d59856054
ROUTE_TABLE_ID02: rtb-0ef2bcaab0bd6e506
ルートの追加
【コマンド】
aws ec2 create-route \
--route-table-id ${ROUTE_TABLE_ID01} \
--destination-cidr-block ${VPC_CIDR02} \
--transit-gateway-id ${TRANSIT_GW_ID}
aws ec2 create-route \
--route-table-id ${ROUTE_TABLE_ID02} \
--destination-cidr-block ${VPC_CIDR01} \
--transit-gateway-id ${TRANSIT_GW_ID}
【結果例】
{
"Return": true
}
通信確認
それぞれのVPCにEC2を立てて、通信を確認してみます。
![]()
出来てますね!
環境の削除
トランジットゲートウェイは一つのVPCに対するアタッチメントにつき、$0.07/h(東京リージョン、12/16時点)、月額にするとおよそ$50とそこそこコストがかかるので、検証目的の場合は削除しておきましょう。
トランジットゲートウェイの料金
ルートの削除
【コマンド】
aws ec2 delete-route \
--route-table-id ${ROUTE_TABLE_ID01} \
--destination-cidr-block ${VPC_CIDR02}
aws ec2 delete-route \
--route-table-id ${ROUTE_TABLE_ID02} \
--destination-cidr-block ${VPC_CIDR01}
【結果例】
戻り値なし
トランジットゲートウェイ アタッチメントの削除
トランジットゲートウェイ アタッチメントIDの取得
削除するトランジットゲートウェイ アタッチメントIDが必要なため取得します。
【コマンド】
TRANSIT_GW_ATTACHMENT_ID01=$( \
jp.py -f create-transit-gw-atatthment01.json \
'TransitGatewayVpcAttachment.TransitGatewayAttachmentId' \
| sed -e "s/\"//g" \
) \
&& echo ${TRANSIT_GW_ATTACHMENT_ID01}
TRANSIT_GW_ATTACHMENT_ID02=$( \
jp.py -f create-transit-gw-atatthment02.json \
'TransitGatewayVpcAttachment.TransitGatewayAttachmentId' \
| sed -e "s/\"//g" \
) \
&& echo ${TRANSIT_GW_ATTACHMENT_ID02}
【結果例】
tgw-attach-0d85e66ca886d25f3
tgw-attach-0e774a432cdb6207e
トランジットゲートウェイ アタッチメントの削除
aws ec2 delete-transit-gateway-vpc-attachment \
--transit-gateway-attachment-id ${TRANSIT_GW_ATTACHMENT_ID01}
aws ec2 delete-transit-gateway-vpc-attachment \
--transit-gateway-attachment-id ${TRANSIT_GW_ATTACHMENT_ID02}
【結果例】
{
"TransitGatewayVpcAttachment": {
"VpcId": "vpc-04ff85daf466a2497",
"TransitGatewayId": "tgw-06273aae66096e98a",
"CreationTime": "2018-12-16T12:40:53.000Z",
"State": "deleting",
"TransitGatewayAttachmentId": "tgw-attach-0d85e66ca886d25f3",
"VpcOwnerId": "************"
}
}
{
"TransitGatewayVpcAttachment": {
"State": "deleting",
"TransitGatewayAttachmentId": "tgw-attach-0e774a432cdb6207e",
"TransitGatewayId": "tgw-06273aae66096e98a",
"CreationTime": "2018-12-16T12:42:14.000Z",
"VpcOwnerId": "************",
"VpcId": "vpc-0f99a9e9ce6475e1f"
}
}
トランジットゲートウェイの削除
【コマンド】
aws ec2 delete-transit-gateway \
--transit-gateway-id ${TRANSIT_GW_ID}
【結果例】
{
"TransitGateway": {
"State": "deleting",
"OwnerId": "************",
"Description": "for test on 20181216",
"CreationTime": "2018-12-16T12:20:33.000Z",
"Options": {
"AssociationDefaultRouteTableId": "tgw-rtb-0c6aecb37236d32d7",
"DefaultRouteTableAssociation": "enable",
"DefaultRouteTablePropagation": "enable",
"AutoAcceptSharedAttachments": "disable",
"VpnEcmpSupport": "enable",
"DnsSupport": "enable",
"AmazonSideAsn": 64512,
"PropagationDefaultRouteTableId": "tgw-rtb-0c6aecb37236d32d7"
},
"TransitGatewayId": "tgw-06273aae66096e98a"
}
}
おわりに
今回の試してみた環境ではVPC1対1ですが、実際には多数のVPCをつなぐケースで威力を発揮するサービスかと思います。
VPCピアリングではフルメッシュ型での設定が必要なのに対し、ハブ&スポークで構成できるのは強みですね。
また、Direct Connectも対応予定とのことで、リリースされれば更に便利なサービスとなるでしょう。
ただし、VPCピアリングとは違い、各VPCへのアタッチメントが課金対象となるので、比較検討が必要になるかと思います。
どなたかの助けになれば幸いです。
【参考】
AWS News Blog 「New – Use an AWS Transit Gateway to Simplify Your Network Architecture」
AWS CLIコマンドリファレンス