トランジットゲートウェイをAWS CLIで設定する

記事タイトルとURLをコピーする

こんにちは、技術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コマンドリファレンス

城 航太 (記事一覧)

サイトリライアビリティエンジニアリング部・CSM課・課長

AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020