AWSとAzure間でSite-to-Site VPNを張る

# はじめに
AWSとAzure間の通信を行いたい場合は様々な解決策がありますが、最も最小の手間で実現する方法としてはSite-to-Site VPNを使用することです。AWSとAzureはインターネットに接続されており、新たに回線を用意する必要なく接続が可能です。スループットや遅延に高い要求が無い場合に適しています。
[AWS と Microsoft Azure 間のプライベート ネットワーク接続の設計](https://aws.amazon.com/jp/blogs/modernizing-with-aws/designing-private-network-connectivity-aws-azure/)
# Site-to-Site VPNを構成するコンポーネント
AWSおよびAzureでSite-to-Site VPNを構成するためには以下に示すコンポーネントが必要です。AWSでは仮想プライベートゲートウェイ、カスタマーゲートウェイ、Site-to-Site VPNの設定を行います。Azureでも同様の設定が必要ですが、ゲートウェイサブネットという概念があるなど、必ずしもAWS側のコンポーネントと一対一の関係性に無い点に注意してください。以下一つずつ説明していきます。なおAWSと比較してAzure側のコンポーネントは特性や注意事項が多い傾向にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/cd0ef729-38bc-f6ec-7ab4-9f5ef92fc0d4.png)
#### 【AWS】仮想プライベートゲートウェイ（VGW）
仮想プライベートゲートウェイはVGWとも呼ばれ、オンプレミスルータとのIPsec VPN、Direct ConnectなどをVPCと接続するために使用されます。
[仮想プライベートゲートウェイ](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/how_it_works.html#VPNGateway)
#### 【AWS】カスタマーゲートウェイ（CGW）
カスタマーゲートウェイはオンプレミスルータやAzure側のVPN終端コンポーネントを指し、AWS上で対向のパブリックIPアドレスなどを定義します。
[カスタマーゲートウェイデバイス](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/your-cgw.html)
#### 【AWS】Site-to-Site VPN
Site-to-Site VPNはAWSと対向の間で構成するIPsec VPNを定義するコンポーネントです。暗号アルゴリズムやルーティングプロトコル、事前共有キー（PSK）、VPNトンネルの内部CIDRなどで構成します。Site-to-Site VPNは仮想プライベートゲートウェイやTransit GatewayをAWS側の終端とすることが可能です。
[AWS Site-to-Site VPN の仕組み](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/how_it_works.html)
#### 【AWS】ルートテーブル
Site-to-Site VPNで対向のBGPピアから学習したルートをVPCのルートテーブル上で定義する必要があります。（後述しますがAzure側にはこの操作は不要です）静的ルートエントリを作成するか、仮想プライベートゲートウェイから自動的に伝搬させることができます。
#### 【Azure】ゲートウェイサブネット
Azureで仮想ネットワークゲートウェイやExpressRouteを接続するためには、接続したいVnetにゲートウェイサブネットを作成する必要があります。ゲートウェイサブネットは1つのVnetに1つだけ作成できます。ゲートウェイサブネットには仮想マシンをデプロイすることはできません。BGPを有効にした仮想ネットワークゲートウェイを作成する際にゲートウェイサブネットを関連付ければ、自動的にVnet内の仮想マシンから接続先のオンプレミスや他クラウドサービスへのルーティングが可能になります。ゲートウェイサブネット上にはゲートウェイVMとゲートウェイサービスが暗黙的に存在し、それぞれにIPアドレスがアサインされるため、ゲートウェイサブネットのアドレス空間は拡張性も考慮し注意して設計することが重要です。例えば、仮想ネットワークゲートウェイとExpressRouteを併用する場合、最小でも/27の範囲が必要になります。
[ゲートウェイ サブネット](https://learn.microsoft.com/ja-jp/azure/expressroute/expressroute-about-virtual-network-gateways#gateway-subnet)
#### 【Azure】仮想ネットワークゲートウェイ
Azureにおける仮想ネットワークゲートウェイ（VPN Gateway）とは、Site-to-Site VPNの自局側（Azure側）のVPNピアに相当します。AWSが対向の場合、AWSにおけるカスタマーゲートウェイに該当します。使用可能な帯域幅（100Mbps～10Gbps）やゾーン冗長可否、それに伴う料金が段階的に設定されており、要件や拡張性に合わせてグレード（SKU）を選択する必要があります。BGPを使用したダイナミックルーティングが利用可能で、特にユーザによる設定が無くても同一Vnet内のルートテーブルに伝播されます。
[Azure VPN Gateway とは](https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpngateways)
#### 【Azure】ローカルネットワークゲートウェイ
Azureにおける仮想ネットワークゲートウェイ（VPN Gateway）とは、Site-to-Site VPNの自局側（Azure側）のVPNピアに相当します。AWSが対向の場合、AWSにおけるカスタマーゲートウェイに該当します。使用可能な帯域幅（100Mbps～10Gbps）やゾーン冗長可否、それに伴う料金が段階的に設定されており、要件や拡張性に合わせてグレード（SKU）を選択する必要があります。BGPを使用したダイナミックルーティングが利用可能で、特にユーザによる設定が無くても同一Vnet内のルートテーブルに伝播されます。
#### 【Azure】接続（Connection）
AzureにおけるSite-to-Site VPNでは、接続（Connection）を作成することで、予め定義した仮想ネットワークゲートウェイとローカルネットワークゲートウェイ間の論理接続を構築できます。接続にはIPsec VPNの各パラメータを設定する必要があります。また、VPNトンネル一本につき一つずつ構築する必要があります。
# 構築方法
前述の図のとおりにAWSやAzure側のVPCおよびVnet、EC2インスタンスおよびVM（仮想マシン）が設定されているものとします。
#### ①【Azure】ゲートウェイサブネット
Vnetにゲートウェイサブネットを作成します。CIDRの固有設計がなければデフォルトパラメータで特に問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/1c09c2f9-4f12-ca7d-bbd9-5e04bdcb4558.png)
#### ②【Azure】仮想ネットワークゲートウェイ
要件に合った適切なSKUと世代を選択しましょう。仮想ネットワークゲートウェイがデプロイされた後にAzure側のパブリックIPアドレスが自動的にアサインされますので、後述するAWS側の操作のために控えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/80633844-28e3-6653-588d-49224059ea0e.png)
#### ③【AWS】カスタマーゲートウェイ
AWS側から見たカスタマーゲートウェイはAzureの仮想ネットワークゲートウェイになります。Azureで設定したASNを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/07d8f682-17a3-00ac-2669-8793dc87968f.png)
#### ④【AWS】仮想プライベートゲートウェイ
仮想プライベートゲートウェイを作成し、VPCへアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/c24b751a-68b8-dca8-d396-9ca0d91dd0bf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/4680c451-98a6-27d9-f2da-cb6d4c2d075e.png)
#### ⑤【AWS】Site-to-Site VPN
今回は仮想プライベートゲートウェイをVPNの終端として構成します。BGP、設計したVPNトンネルの内部CIDR、事前共有キーなどを設定します。Site-to-Site VPNがデプロイされると「トンネルの詳細」タブでAWSがアサインしたパブリックIPアドレスが２つ判明しますので、後述するAzure側の操作のために控えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/7aad4b5b-df58-6f0e-3a90-bfa3d1f4295b.png)
#### ⑥【Azure】ローカルネットワークゲートウェイ
Azureから見たローカルネットワークゲートウェイは控えておいたAWSの1つ目のパブリックIPアドレスを設定します。AWS側のASNやBGPピアのIPアドレスもここで設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/a4e6c059-19ac-1214-4d24-c670eb64fd40.png)
#### ⑦【Azure】接続（Connection）
IPsec VPNのIKEバージョンや事前共有キー、Azure側BGPスピーカのIPアドレスを設定します。なおAzure側では1本のVPNトンネルごとにローカルネットワークゲートウェイと接続を作成します。今回はトンネル2本なのでローカルネットワークゲートウェイと接続も２つ作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/12ed232d-692a-c894-67c4-1306d018bc43.png)
#### ⑧【AWS】ルートテーブル
仮想プライベートゲートウェイをアタッチしたVPCのルートテーブルに、Site-to-Site VPNからBGPで学習したルートを自動で伝播させるよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/a6d0a888-6795-f0ea-c0c5-a026df294802.png)
ルートテーブルにAzureのVnetとVPNトンネルのCIDRが伝播されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/d41511d5-78c5-3b38-c54e-a85b9c5cd594.png)
# 確認
AWS側でSite-to-Site VPNの「トンネルの詳細」を確認します。IPsecVPNが確立し、BGPネイバーが張れていればステータスがUPになります。なお、本記事執筆時点でAzureの不具合があり、あるパラメータの修正をしないと2本目のトンネルからBGP経路を学習できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/7fe7fdd1-efd8-3701-ee54-e5d277f230f3.png)
Azure側でも確認します。BGPピアの画面でAWSのVPC CIDRがEBGPにより学習されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/12828ad2-e3ff-fc26-08ef-99bc37461336.png)
AWS側のEC2からAzure側のVMへICMPによる確認をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731465/057826e1-fda5-f852-9946-514bd8e20dcb.png)
# まとめ
AWSとAzure間のSite-to-Site VPNを実際に構築し、マルチクラウド構成を試してみました。AWSとAzureとでSite-to-Site VPNを実現するためのコンポーネントにいくつかの相違点や注意事項があることが分かりました。