動的なAWS VPN接続における優先順位をまとめる

# 学習前
ECMP(等コストマルチパス)ルーティングが有効化されてる時のオンプレ-AWS接続において、複数のVPNがどんな優先順位で使われることになるのか、全然覚えられない…

# 結論
以下の順番で、優先的にルーティングされます。
※Direct Connect接続がある場合は、それが最も優先されます。

1. より具体的なプレフィックスで指定されているルート
1. AS PATHが短いルート
1. MED(Multi-Exit Discriminator)が低いルート

# 今回の想定する構成図
Transit Gatewayとオンプレミス間でSite-to-Site VPN接続を構成しています。

また、Site-to-Site VPN接続はTransit Gateway上で等コストマルチパスルーティングを有効にしています。

![VPN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/f47d3fb3-b67c-4978-bb4d-0f9415e0c113.png)

このような時に、データセンターからEC2にトラフィックを送信する時のルートで、上下どちらのSite-to-Site VPNを優先して使用するか決めたい時にはどうすれば良いでしょうか？

# 1.より具体的なプレフィックスで指定されているルート
例えば、EC2のIPアドレスが `10.1.2.10` であり、VPCのCIDRが `10.1.2.0/24` だとします。

そして、上のVPNは `10.1.0.0/16` の範囲、下のVPNは `10.0.0.0/8` の範囲でAWSへの通信を許可している、としたらどうでしょうか。どちらのVPNトンネルが優先されるでしょう？
![VPN2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/64a977ae-b248-00c7-ceab-b4f58646c3f4.png)

正解は、上のVPN。
理由は、より具体的なプレフィックスで指定されているからです。

具体的なプレフィックスとは、IPアドレスの範囲が狭い(=サブネットマスクが長いルート)を意味します。

したがって、もし上のVPNの方が帯域幅の広い回線だった場合は、意図的により具体的なプレフィックスを指定することで、優先してルーティングすることができるようになります。

これを**ロンゲストプレフィックスマッチ**、すなわち最長プレフィックス一致ということもあります。

# 2.AS PATHが短いルート
先ほどとは少し構成図が変わって、このような形の時はどうでしょう。

異なる点は大きく3つあります。

- VPNが通信を許可している範囲が `10.1.0.0/16` で同じ
- カスタマーゲートウェイが2つに増えた
- 上のルートでは中経ルーターも増えた

![VPN4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/36249526-14e5-fc4d-6f8a-811e05232a8f.png)

このような時には、下のルートが優先して用いられます。

その理由は、AS PATHの短いルートが優先されるからです。
そもそもAS(Autonomous System=自律システム)とは、インターネットを構成するネットワークの単位です。もっと簡単に言うと、インターネットの世界における縄張りみたいなものです。

インターネットの世界、特にBGPのルーティングでは、そのASに割り当てられた番号を用いて行き先を特定します。

その際に用いられるのが、AS PATHです。
データが目的地へたどり着くまでに通るASのリストのことです。

データセンターから見ると、EC2へのルート自体は2つあるわけですが、
- 上のルートはAS PATH: 10, 65000, 65002
- 下のルートはAS PATH: 65001, 65002

というように、経由するASの数が異なります。下の方が少なくなっています。

この時、下のルートが優先して用いられるようになります。

この仕様を利用して、経路の優先度を操作することもできます。特定の経路を優先させるためにわざとAS番号をリストに追加すれば、実現可能です(これを**AS PATH プリベンド**と言います)。

:::note warn
ただし、AWS公式ドキュメントにおいてAS PATH プリベンドの使用はお勧めしませんと明記されています。その代わりに、**非対称ルーティングをサポートするカスタマーゲートウェイデバイスの使用が推奨**されています。

その理由としては、以下の3つがあります。
- 柔軟なフェイルオーバーが可能
- トラフィックの負荷分散が可能
- メンテナンスが容易

非対称ルーティングをアーキテクチャ図にするとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/9b146e93-ddd0-c345-2b5a-7ed9ffd429c3.png)

上のルートがインバウンド用、下のルートがアウトバウンド用のルートです。
こうすることで、トラフィックが1つのルートに集中することがなくなり、負荷分散が見込めます。

そして、どちらかの経路に障害が発生したとしても、もう片方の経路でトラフィックを維持しながらメンテナンスができます。

これらのメリットを踏まえて、非対称ルーティングが推奨されています。
:::

# 3.MED(Multi-Exit Discriminator)が低いルート
MEDとは、同じASから複数のルートが提供されている場合に、どのルートを優先するべきか決定するために使用されます。
この値が**最も小さいPATHを優先**してルーティングします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/a2bc56e3-3ff4-80e5-44e4-5858943ca8c3.png)

この場合は、AS_PATHが同じなのでMEDで判定を行います。
そしてMEDは小さいほうが優先されるので、上のルートが優先されます。

::: note warn
ただし、AWSでは評価の優先度が低いため、MED値の使用は非推奨となっています。
:::

# まとめ
以下の順番で、優先的にルーティングされます。
※Direct Connect接続がある場合は、それが最も優先されます。

1. より具体的なプレフィックスで指定されているルート
1. AS PATHが短いルート
1. MED(Multi-Exit Discriminator)が低いルート

(ネットワーク難しすぎる…もう少しキャッチアップします。)

参考：

https://repost.aws/ja/knowledge-center/vpn-configure-tunnel-preference

https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/routing-and-bgp.html