こんにちは、技術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コマンドリファレンス
城 航太 (記事一覧)
営業部カスタマーサクセス課・課長
AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020