ちょっと話題の記事

Virtual Private GatewayとのVPN接続をTransit Gatewayに移行できるようになりました

2019.05.02

はじめに

中山(順)です

仮想プライベートゲートウェイとのVPN接続をTransit Gatewayに移行できるようになりました。

Migrate Your AWS Site-to-Site VPN Connections from a Virtual Private Gateway to an AWS Transit Gateway

やってみた

VGWとVPN接続している状態を作成しておきます。 今回は、以下の記事で構築した環境を移行してみます。 というか、以下の記事はこの記事のために書きました。

YAMAHA RTX830でお手軽VPN接続

移行前の構成は以下の通りです。

これを以下のようにします。

以下の手順で移行をすすめます。

  • Transit Gatewayを作成およびVPCにアタッチ
  • VPN Connectionを変更
  • ルートテーブルを修正

Modifying a Site-to-Site VPN Connection's Target Gateway

今回はAWS CLIでやっていきます。

Transit Gatewayを作成およびVPCにアタッチ

Transit Gatewayを作成します。

aws ec2 create-transit-gateway
{
    "TransitGateway": {
        "TransitGatewayArn": "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:transit-gateway/tgw-05b0a9c4c2fec5f4b",
        "CreationTime": "2019-05-01T16:25:32.000Z",
        "State": "pending",
        "TransitGatewayId": "tgw-05b0a9c4c2fec5f4b",
        "OwnerId": "521539043457",
        "Options": {
            "DefaultRouteTableAssociation": "enable",
            "DnsSupport": "enable",
            "AutoAcceptSharedAttachments": "disable",
            "AssociationDefaultRouteTableId": "tgw-rtb-00df1442d804fb846",
            "PropagationDefaultRouteTableId": "tgw-rtb-00df1442d804fb846",
            "AmazonSideAsn": 64512,
            "DefaultRouteTablePropagation": "enable",
            "VpnEcmpSupport": "enable"
        }
    }
}

このTransit GatewayをVPCにアタッチします。

aws ec2 create-transit-gateway-vpc-attachment \
    --transit-gateway-id tgw-05b0a9c4c2fec5f4b \
    --vpc-id vpc-0540e877c50287092 \
    --subnet-ids subnet-0b38aff0967a8bd79 subnet-0bd6948809a875968 subnet-06b10a86356d582b8
{
    "TransitGatewayVpcAttachment": {
        "VpcId": "vpc-0540e877c50287092",
        "VpcOwnerId": "521539043457",
        "SubnetIds": [
            "subnet-0bd6948809a875968",
            "subnet-0b38aff0967a8bd79",
            "subnet-06b10a86356d582b8"
        ],
        "TransitGatewayAttachmentId": "tgw-attach-08bc765835a81efc5",
        "CreationTime": "2019-05-01T16:28:31.000Z",
        "State": "pending",
        "TransitGatewayId": "tgw-05b0a9c4c2fec5f4b",
        "Options": {
            "DnsSupport": "enable",
            "Ipv6Support": "disable"
        }
    }
}

現時点でのTransit Gatewayのルートテーブルの状態を確認しておきます。

aws ec2 describe-transit-gateway-route-tables
{
    "TransitGatewayRouteTables": [
        {
            "DefaultPropagationRouteTable": true,
            "Tags": [],
            "CreationTime": "2019-05-01T16:26:02.000Z",
            "TransitGatewayRouteTableId": "tgw-rtb-00df1442d804fb846",
            "State": "available",
            "TransitGatewayId": "tgw-05b0a9c4c2fec5f4b",
            "DefaultAssociationRouteTable": true
        }
    ]
}
aws ec2 search-transit-gateway-routes \
    --transit-gateway-route-table-id tgw-rtb-00df1442d804fb846 \
    --filters Name=attachment.resource-id,Values=vpc-0540e877c50287092
{
    "Routes": [
        {
            "TransitGatewayAttachments": [
                {
                    "ResourceType": "vpc",
                    "ResourceId": "vpc-0540e877c50287092",
                    "TransitGatewayAttachmentId": "tgw-attach-08bc765835a81efc5"
                }
            ],
            "DestinationCidrBlock": "10.0.0.0/16",
            "State": "active",
            "Type": "propagated"
        }
    ],
    "AdditionalRoutesAvailable": false
}

以上のように、VPCのCIDRがTransit Gatewayに広告されていることが分かります。

VPN Connectionを変更

ここもAWS CLIで設定しようと思いましたが、どうやらブログの執筆時点でAWS CLIにコマンドが提供されていないようでした。 しょうがないので、マネージメントコンソールで設定します。

変更先であるTransit Gatewayを指定します。

変更処理が開始されてしばらくすると、通信ができなくなります。

しばらくすると、VPNトンネルのステータスが復活します。 この際、VPNルーターの設定は変更しておりません。

以下はルーターのsyslogです。

2019/05/02 02:11:02: same message repeated 3 times
2019/05/02 02:11:02: [IKE] SA[1] DPD: detected dead peer
2019/05/02 02:11:03: [IKE] initiate ISAKMP phase to xxx.xxx.xxx.xxx (local address zzz.zzz.zzz.zzz)
2019/05/02 02:11:03: [IKE] initiate informational exchange (delete)
2019/05/02 02:11:03: same message repeated 1 times
2019/05/02 02:11:03: IP Tunnel[1] Down
2019/05/02 02:11:07: [IKE] initiate informational exchange (delete)
2019/05/02 02:11:08: [IKE] initiate ISAKMP phase to xxx.xxx.xxx.xxx (local address zzz.zzz.zzz.zzz)
2019/05/02 02:11:10: [IKE] SA[2] DPD: detected dead peer
2019/05/02 02:11:11: [IKE] initiate ISAKMP phase to yyy.yyy.yyy.yyy (local address zzz.zzz.zzz.zzz)
2019/05/02 02:11:11: [IKE] initiate informational exchange (delete)
2019/05/02 02:11:11: same message repeated 1 times
2019/05/02 02:11:11: IP Tunnel[2] Down
2019/05/02 02:11:15: [IKE] initiate informational exchange (delete)
2019/05/02 02:11:16: [IKE] initiate ISAKMP phase to yyy.yyy.yyy.yyy (local address zzz.zzz.zzz.zzz)
2019/05/02 02:13:25: [IKE] initiate IPsec phase to xxx.xxx.xxx.xxx
2019/05/02 02:13:26: IP Tunnel[1] Up
2019/05/02 02:13:33: [IKE] initiate IPsec phase to yyy.yyy.yyy.yyy
2019/05/02 02:13:34: IP Tunnel[2] Up

ルートテーブルを修正

ここまでで、VPN接続自体の移行は完了しますが、エンドツーエンドの通信は復活していません。 なぜなら、これまではVGWに広告されていた経路を自動でルートテーブルに広告していたのですが、Transit GatewayをVPCにアタッチしただけでは経路を広告してくれないためです。

そのため、手動でルートを追加します。

ここまでの作業でエンドツーエンドの通信が復活しました。

ルートの確認

以上のように、VPCから広告された経路だけでなく、VPNから広告された経路も確認できます。

aws ec2 search-transit-gateway-routes \
    --transit-gateway-route-table-id tgw-rtb-00df1442d804fb846 \
    --filters Name=attachment.resource-type,Values=vpn
{
    "Routes": [
        {
            "TransitGatewayAttachments": [
                {
                    "ResourceType": "vpn",
                    "ResourceId": "vpn-0b491a1a6c8c6ba29(xxx.xxx.xxx.xxx)",
                    "TransitGatewayAttachmentId": "tgw-attach-0f39950ff4639057c"
                },
                {
                    "ResourceType": "vpn",
                    "ResourceId": "vpn-0b491a1a6c8c6ba29(yyy.yyy.yyy.yyy)",
                    "TransitGatewayAttachmentId": "tgw-attach-0f39950ff4639057c"
                }
            ],
            "DestinationCidrBlock": "0.0.0.0/0",
            "State": "active",
            "Type": "propagated"
        }
    ],
    "AdditionalRoutesAvailable": false
}
aws ec2 search-transit-gateway-routes \
    --transit-gateway-route-table-id tgw-rtb-00df1442d804fb846 \
    --filters Name=attachment.resource-type,Values=vpc
{
    "Routes": [
        {
            "TransitGatewayAttachments": [
                {
                    "ResourceType": "vpc",
                    "ResourceId": "vpc-0540e877c50287092",
                    "TransitGatewayAttachmentId": "tgw-attach-08bc765835a81efc5"
                }
            ],
            "DestinationCidrBlock": "10.0.0.0/16",
            "State": "active",
            "Type": "propagated"
        }
    ],
    "AdditionalRoutesAvailable": false
}

まとめ

この通り、Transit Gatewayへの移行にはダウンタイムを伴います。

とはいっても、Transit Gatewayに移行することでトポロジーが圧倒的にシンプルになりますので、ネットワークが複雑で管理に難儀している方にはおすすめです。

現場からは以上です。