【マルチクラウド】AWSとGoogleCloud間をHA VPNで接続する
AWSとGoogle Cloud間でSite-to-Site VPNを構築し、EC2とCompute Engine間で疎通確認を行いました。
本記事では、実際に構築した構成と、接続時に分かりにくかった「トンネル数の違い」についても解説します。
構成図 (簡易的ですが)
- それぞれのクラウド内にプライベートサブネットを設置し、その中にインスタンスを立てています。
- サブネットが重複しないようにしています。
構成概要
AWSとGoogle CloudのそれぞれにVPCを作成し、HA VPNを使用して接続します。
通信経路の制御にはBGPを使用し、Google Cloud側ではCloud Routerを利用してルート交換を行います。
構成のポイントは以下です。
- AWS側:Virtual Private Gatewayを使用
- Google Cloud側:HA VPN Gateway + Cloud Routerを使用
- ルーティング:BGPによる動的ルーティング
- 疎通確認:EC2 <- -> Compute Engineそれぞれでping
作成したリソース一覧
AWS側
- VPC
- Subnet
- Route Table
- EC2
- Virtual Private Gateway
- Customer Gateway(Google Cloud側VPN用)
- Site-to-Site VPN Connection
Google Cloud側
- VPCネットワーク
- サブネット
- Compute Engine
- Cloud Router
- HA VPN Gateway
- VPN Tunnel(AWS側VPN用)
VPN接続の作成
本構成では、先にGoogle Cloud側を構築し、その情報をもとにAWS側のVPN接続を作成します。
理由として、AWS側でCustomer Gatewayを作成する際に、Google Cloud側のVPN GatewayのグローバルIPアドレスが必要になるためです。(多分どっちから作ってもやりようはある)
構築の流れは以下の通りです。
- Google Cloud側の構築
- AWS側の構築
- Google Cloud側でVPNトンネルを完成させる
Google Cloud側の構築
1. VPCネットワーク+GCEの作成
まず、VPN接続先となるVPCを作成します。
例:
- VPC CIDR:10.10.0.0/16
- Subnet:10.10.1.0/24
このサブネット内にCompute Engineを作成し、疎通確認に使用します。
2. Cloud Routerの作成
次にCloud Routerを作成します。
Cloud Routerは、BGPを使用してAWS側とルート交換を行うために必要です。
Cloud Routerは以下の情報を設定して作成します。
- 接続するVPC
- リージョン
- ASN(プライベートASN)
Cloud Routerは、後で作成するHA VPN Gatewayと関連付けられます。
3. HA VPN Gatewayの作成
次にHA VPN Gatewayを作成します。
HA VPN Gatewayは冗長構成のVPN Gatewayであり、複数のインターフェースと外部IPアドレスを持ちます。
作成後、以下の情報を確認できます。
- VPN Gatewayの外部IPアドレス(複数)
このIPアドレスを後ほどAWS側のCustomer Gateway作成時に使用します。
AWS側の構築
Google Cloud側のVPN Gatewayの外部IPアドレスが取得できたら、AWS側の構築を行います。
1. Virtual Private Gatewayの作成
まず、Virtual Private Gatewayを作成します。
作成後、対象のVPCへアタッチします。
これにより、VPCがVPN接続可能になります。
2. Customer Gatewayの作成
次にCustomer Gatewayを作成します。
ここで、Google Cloud側のHA VPN Gatewayの外部IPアドレスを指定します。
設定内容:
- 接続先IPアドレス:Google CloudのVPN Gateway外部IP
- ルーティング方式:動的(BGP)
- ASN:Google Cloud側のASN
HA VPNは複数のIPアドレスを持つため、それぞれに対してCustomer Gatewayを作成します。
3. Site-to-Site VPN Connectionの作成
次に、Site-to-Site VPN Connectionを作成します。
設定内容:
- Virtual Private Gateway:先ほど作成したVGW
- Customer Gateway:先ほど作成したCustomer Gateway
- ルーティング:動的(BGP)
作成後、AWS側で以下の情報が生成されます。
- トンネルの外部IPアドレス
- BGPピアIPアドレス
この情報をGoogle Cloud側で使用します。
Google Cloud側でVPNトンネルの作成
AWS側VPN Connection作成後、Google Cloud側に戻りVPNトンネルを作成します。
設定項目:
- VPN Gateway:作成済みHA VPN Gateway
- 接続先IP:AWS側VPNトンネルIP
- Cloud Router:作成済みCloud Router
- IKE(事前共有鍵)の設定
これにより、
- IPsecトンネル
- BGPセッション
が確立されます。
BGPによるルート交換
VPNトンネル確立後、Cloud RouterとAWS VGW間でBGPピアが確立されます。
これにより、
- AWS VPCのCIDR
- Google Cloud VPCのCIDR
が自動的に交換されます。
静的ルートの追加は不要です。
接続確認
VPNトンネルの状態が「UP」になり、BGPが確立すると通信可能になります。
AWS側(Site-to-Site VPN接続)
GCP側(Cloud VPNトンネル)
EC2からGCEへpingが通りました。
(ICMPをSGやGCEではFWで許可することを忘れずに...)
EC2:10.20.1.177
GCE:10.10.1.3
ルート交換(BGP)
Google Cloud側ではCloud Routerを使用し、AWS側とBGPでルート交換を行います。
これにより、
- AWS VPCのCIDR
- Google Cloud VPCのCIDR
がお互いに自動で伝播されます。
その結果、追加の静的ルート設定なしで通信が可能になります。
GCPのルートテーブルを見るとBGPで追加された経路が「動的」という種類で追加されています。ネクストホップもVPNトンネルになっていますね。
トンネル数の違いについて
今回の構成で、少し分かりにくかったポイントが「トンネル数」です。
結論から言うと、
- AWS側:Site-to-Site VPN 接続1つにつき、トンネルが2つ作成されるため、Site-to-Site VPN 接続を2つつなぐ(今回の構成)とトンネルが4つ用意される
- Google Cloud側:HA VPNを使用する場合、インターフェースアドレスが2つ作成される
となり下図のような構成になります。
GCP側はインターフェースアドレスが2つなので、IPトンネルは2つしか構築できません。
AWSの管理画面では、VPN接続ごとに2本のトンネルが作成されますが片方ずつのみをつないだ状態になります。
実際のAWSコンソールでは以下のように表示されます。
このように、すべてのトンネルがUPしていなくても通信は可能ですし、冗長構成をとることはできます。
GCP側でインターフェースアドレスを増やすことによって、4本のトンネルを接続することもできますが、企業レベルで可用性を考えるときに必要になるかなーとおもいます。
IKE事前共有鍵(PSK)について
AWSとGoogle CloudのSite-to-Site VPNでは、IPsecトンネルの認証方式としてIKE(Internet Key Exchange)の事前共有鍵(Pre-Shared Key, PSK)を使用します。
今回の構成では、AWS側でVPN Connectionを作成した際に、各トンネルごとにIKE事前共有鍵(PSK)が自動的に生成されます。
AWSコンソールからVPN Connectionの詳細を開くことで、以下の情報を確認できます。
- トンネル外部IPアドレス
- BGPピアIPアドレス
- IKE事前共有鍵(PSK)
Google Cloud側でVPNトンネルを作成する際に、このAWS側で生成されたPSKを入力することで、トンネルの認証が行われます。
つまり、鍵の生成はAWS側で行い、その鍵をGoogle Cloud側に設定することで、両者のIPsecトンネルが確立されます。
なお、このPSKはトンネルごとに個別に存在するため、それぞれ対応するトンネルに対して正しいPSKを設定する必要があります。
PSKが一致しない場合、VPNトンネルは確立されず、ステータスはDOWNのままとなります。
そのため、VPN設定時には各トンネルのPSKの対応関係に注意が必要です。
まとめ
AWSとGoogle Cloud間でHA VPNを構築し、EC2とCompute Engine間での疎通を確認することができました。
Cloud RouterによるBGPルート交換を利用することで、静的ルートを設定することなく、お互いのVPC CIDRが自動的に伝播され、スムーズに通信を確立できます。
構築自体はそれほど複雑ではありませんが、実際に構築してみて特に分かりにくかったのは以下の点でした。
- AWS側ではVPN接続ごとにトンネルが2本作成されること
- HA VPN構成では、結果としてAWS側に4本のトンネルが用意されること
- すべてのトンネルがUPしていなくても通信自体は可能であること
- IKE事前共有鍵(PSK)をトンネルごとに正しく対応させる必要があること
特に、AWSコンソール上でDOWNと表示されているトンネルがあっても正常に通信できるため、最初は状態の解釈に少し戸惑いました。
マルチクラウド構成は難しそうな印象がありますが、各コンポーネントの役割とトンネルの対応関係を理解してしまえば、比較的シンプルに構築できます。
同様の構成を検証する際の参考になれば幸いです。
また、トンネルを一部のみ使用した場合と、すべてのトンネルを使用した場合の可用性の違いについても、今後検証する機会があればまとめてみたいと思います。






