VPCとオンプレの間の接続をVPNからDirect Connect(DX)に移行しました
その際にVGWのルーティングで悩まされたポイントのメモ
1つのVPCにアタッチできるVGWは1つだけとなります。
つまり、VPCに対し複数のVPNあるいはDXの接続を作成した場合には全ての接続が1つのVGWによって束ねられることになります。
しかし、VPCのroute tableで制御できるのは、特定のネットワークアドレスに対する宛先をVGWに向けることだけです。
VGWの先に複数の接続がある場合にどの経路に対しルーティングが行われるかは、VPN接続、DXのそれぞれの設定に依存することになります。
複数の接続先が全く異なるネットワークアドレスであれば特に問題ないのですが、バックアップ回線による冗長化や今回のようにVPNからDXへの移行時など、同じ宛先経路を持つ場合、ルーティングはどのように制御されるのかを調べてみました。
AWSの公式FAQには下記のような記載があります。
Q: AWS Direct Connect と VPN 接続を同時に同じ VPC に使用することはできますか?
A: はい。ただし、フェイルオーバーシナリオのみで可能です。Direct Connect パスが確立されると、AS パスプリペンドに関係なく、常に Direct Connect パスが優先されます。
この記載によると、VPN接続とDXでは問答無用にDXが優先されるようです。
普段はDX側にトラフィックを流し、バックアップ回線としてVPNを使うケースを想定してるようです。
この仕様だと、すでにVPN接続があるオンプレ環境に対しDXを接続すると、即座にDXの方にルーティングが向いてしまいますので、使用中の回線を切り替える場合には注意が必要そうです。
そして、今回は自前で回線・ルータを用意する占有型ではなくAWSパートナーの回線からVirtual Interfaceを割り当ててもらう共有型の接続のため、BGPのコネクションが確立されるタイミングが正確に予測できず、Virtual Interfaceの承諾操作も開通日前に事前に実施しておかなければいけないという事情がありました。
現時点でサービスに仕様しているVPN接続を、疎通テストもしていない回線にタミングも読めずいきなり切り替えられるのはリスクが高すぎます。
回避策がないか調べたところ、ありました。
VGWの経路優先度
DXが優先されるのはあくまでも、プレフィクス長を含めた同じ宛先サブネットの場合であり、プレフィックス長が異なる場合にはロンゲストマッチが有効なようです。
それぞれで下記のようなルートを持っていたとすると、
DX:192.168.0.0/24
VPN:192.168.0.0/24
この場合は192.168.0.0/24に属する宛先への通信はすべてDXに流れますが、
DX:192.168.0.0/24
VPN:192.168.0.0/24,192.168.0.1/32,192.168.0.2/32
とすると、192.168.0.1と192.168.0.2宛の通信はVPNを通り、それ以外の192.168.0.*への通信はDXを通ることになります。
移行手順
という訳で、VPN接続からDXへの移行いんあたっては以下のステップを踏むことで既存の通信への影響を最小限に抑えることができます。
- 既存のVPN接続で必要な宛先IPについてすべて/32のルーティングを追加
- DXを開通
- 空いているIPを使ってDXの通信テスト
- VPN接続で/32のルーティングを削除
1をいてれおくことで、2のタイミングで既存サービスの通信がDXへ向くことを抑止し、諸々の準備が整ったところで任意のタミングで4を実施すれば切り替え完了です。
補足
一般的なルータであれば同じ宛先に対する経路の決定は以下の優先度で決定するはずです。
- ロンゲストマッチ
- アドミニストレーティブディスタンス(AD値)
- メトリック
今回の件でVGWのルート決定においてロンゲストマッチとメトリックが有効であるとわかりました。
では、AD値による優先度はあるのでしょうか?
同じプレフィックス長であればDXが優先されるというのは、VPN接続とメトリックが比較されていると思われます。
VPN接続ではBGP意外にStatic Routeも設定可能ですが、仮に、AD値も有効だとすると、DX(BGP)とVPN接続(Static)で同じ宛先を設定した場合にはVPN接続側が優先されそうな気がします。
検証してみたいところですが、DXはなかなか気軽に触れず、情報があれば頂けると幸いです。
また、BGPの制御などはNWエンジニアでないとハードルが高い部分もありますので、DX/VPNの各接続に対しVGWでStatic Routeを設定できるような機能もあると嬉しいと思いました。