ちょっと話題の記事

Amazon VPCとGoogle Compute EngineをVPN接続する

2015.03.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
去る3/4にGoogleのIaaSであるGoole Compute EngineVPNサービスがパブリックベータになりました。AWSのネットワークサービスにあたるAmazon VPCにもVPN機能がありたまたま互換性があったので、それらの相互接続を試してみました。

構成

まずは構成図をどーんと。

vpn-interconnect01

と言ってもトンネル1本の構成であれば至ってシンプルで、AWSのVPCとGCEのNetworkをIPsecのVPNトンネルで接続するだけです。GCEのプライベートネットワークは複数リージョンを跨いで構成できますが、現時点ではVPN接続を定義した同じリージョンのVMインスタンスしかVPN接続を利用できないという制限があります。AWSのリージョンとGCEのリージョンを合わせる必要はありません。

費用はGCEはベータ期間中はOutboundの転送料金(GBあたり$0.12)のみ、GA後は1トンネルにつき$0.05/h(月額$37.5)かかります。AWSはOutboundの転送料金がGBあたり$、VPN接続1つにつき$0.048/h(月額$36)(東京リージョンの場合)です。気をつけなければならないのは本数の数えかたの違いです。GCEはトンネル単位なので、GCE側、AWS側の両方を冗長構成とすると2*2でトンネル4本分の費用が発生するのに対し、AWSはVPN接続のうちAWS側は既定で冗長構成になっているため、先ほどと同じ構成でも2接続分の費用で済みます。

AWS、GCEともにWebコンソール画面のポチポチ操作で完結できるのですが、AWSのVPN接続仕様により順番が重要なので、注意して進めましょう。

1. [GCE]グローバルIPの取得

まずは、VPN接続のGCE側となるグローバルIPをDeveloper Consoleで取得します。VMインスタンスが使用する静的IPアドレスと区別しないので、[計算処理] - [ネットワーク]をメニューから選択、[新しい静的IP]ボタンをクリックします。

vpn-interconnect02

静的IPにつける名前のほかVPN接続を作成するリージョンを選択、[OK]ボタンで作成されます。

vpn-interconnect03

以下のように静的なグローバルIPアドレスが取得できました。

vpn-interconnect04

2. [AWS]VPN接続の作成

GCE側のエンドポイントが確定したので、ここからはAWS側でVPN接続を定義します。Management ConsoleのVPC管理画面のメニューにある[VPN Connections] - [Customer Gateways]を選択し、[Create Customer Gateway]ボタンをクリックします。

vpn-interconnect05

[Name Tag]は適当なCustomer Gateway名を入力、[Routing]は今回は「Static」のままにし、[IP Address]に先ほど取得したGCEの静的IPを入力、[Yes, Create]ボタンをクリックします。

vpn-interconnect06

Customer Gateway(VPC VPNの接続先)が定義されました。

vpn-interconnect07

続いて、VPC側の仮想プライベートゲートウェイを定義します。メニューから[Virtual Private Gateways]を選択、[Create Virtual Private Gateway]をクリックします。

vpn-interconnect08

[Name Tag]に適当なプライベートゲートウェイ名を入力し、[Yes, Create]ボタンをクリックします。

vpn-interconnect09

プライベートゲートウェイが作成されました。続いて、ゲートウェイをVPCに割り当てるため、[Attach to VPC]ボタンをクリックします。

vpn-interconnect10

今回接続するVPCを選択、[Yes, Attach]ボタンをクリックします。

vpn-interconnect11

メニューから[VPN Connections]を選択、[Create VPN Connection]をクリックします。

vpn-interconnect12

[Name Tag]は適当なVPN接続名、Virtual Private GatewayとCustomer Gatewayは先ほど作成したものが選択されていることを確認します。[Static IP Prefixes]にはGCEネットワークの帯域(今回は10.240.0.0/16)を入力し、[Yes, Create]ボタンをクリックします。

vpn-interconnect13

検証時はVPN接続作成に伴うルーティング設定でたまたまエラーが発生したため、[Static Routes]タブでルーティングを再設定しました。

vpn-interconnect14

[Tunnel Details]タブのトンネルのうちどちらかの[IP Address]列のIPアドレスを控えておきます。続いて、[Download Configuration]ボタンをクリックします。

vpn-interconnect15

[Vendor]から「Generic」を選択し、[Yes, Download]ボタンをクリックするとVPN設定が書かれたテキストファイルがダウンロードされます。

vpn-interconnect16

テキストファイルにはトンネル2本分の定義が書かれているので、先ほど控えたトンネルのIPアドレスを見つけ出し、対応する[Pre-Shared Key](共有鍵)の項目を確認します。このあとGCEのVPN接続設定に入力します。

vpn-interconnect17

3. [GCE]VPNの定義と接続

AWS側のVPN設定が完了したので、いよいよGCE側でVPN接続を定義し、接続します。AWSのVPN接続はIPsecレスポンダとしてしか動作しないため、AWS→GCEの順に設定する必要があります。Developer Consoleの[ネットワーキング] - [VPN]を選択し、[VPNを作成]ボタンをクリックします。

vpn-interconnect19

任意の名前を入力、[IPアドレス]は手順1で取得した静的IPを選択します。

z

vpn-interconnect20

画面をスクロールし、[トンネル]セクションでIPsecの設定を入力します。[リモートピアIPアドレス]にAWS側のトンネルIP、[IKEバージョン]を「IKEv1」、[共有シークレット]に手順2の「Pre-Shared Key」を貼り付け[リモートネットワークIPの範囲]にVPCのアドレス帯域を入力、[作成]ボタンをクリックします。

gcpvpc

しばらく待ち、[ピアIPアドレス]列に緑のチェックマークが表示されれば、VPN接続成功です。

vpn-interconnect22

GCE Networkのルート設定には先ほど設定したリモートネットワークIP範囲(AWSのネットワーク帯域)のルーティングエントリーが自動で追加されるため、特に設定は必要ありません。AWS側からの接続を許可するために、ファイヤーウォールを適宜調整します。

vpn-interconnect23

4. [AWS]VPN接続の確認

同様に、AWS側でVPN接続が確立されているかとルーティングテーブルを確認します。VPN接続の[Tunnel Details]タブのうち、設定したトンネルの[Status]列が「UP」になっていることが確認できます。

vpn-interconnect24

VPCサブネットのルーティングテーブルにVPN接続のルーティングエントリーを反映するためにはRoute Propergationが手軽です。VPC管理画面の[Route Tables]から設定したいルーティングテーブルを選択し、[Route Propergation]タブをクリックしてRoute Propergationの有効/無効を確認します。

vpn-intetconnect25

無効の場合は[Edit]ボタンからPropergateのチェックをオンにし[Save]ボタンで設定を保存します。

vpn-interconnect26

[Routes]タブを表示すると、ルーティングエントリーにGCEのIPアドレス帯域に仮想プライベートゲートウェイ(vgw-*)経由で接続するルーティングエントリーが確認できます。

vpn-intetconnect27

これで準備OKです。

動作確認

今回は、GCE VMインスタンスからAWS VPC内に配置しているRDS for MySQLのDBインスタンスにmysqlコマンドで接続してみます。まずはgcloud compute sshコマンドでVMインスタンスにSSH接続します。

$ gcloud compute ssh mysql-test
Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts.
Linux ghost-test 3.16.0-0.bpo.4-amd64 #1 SMP Debian 3.16.7-ckt2-1~bpo70+1 (2014-12-08) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Mar  4 04:44:58 2015 from XXXXXXXXXXXX
ryuta@mysql-test:~$

接続方法はEC2インスタンスの場合と特に変わりません。Public Accessを無効にしているDBインスタンスはDNS名*.ap-northeast-1.rds.amazonaws.comに対してVPCのPrivate IPが変えるようになっていますので、特に意識せずVPN経由での接続になります。

ryuta@mysql-test:~$ mysql -u master -h mydb.XXXXXXXX.ap-northeast-1.rds.amazonaws.com -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.19 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.04 sec)

mysql>

正常に接続していますね!

まとめ

AWSにはVPCのプライベートネットワーク内に配置する数多くのマネージドサービス(ElastiCache、Redshiftなど)があります。GCEのVMインスタンスからセキュアにそれらにアクセスできるようになれば、複数クラウドを活用した新しいアーキテクチャの可能性が見えてくるのではないでしょうか。また、1本のトンネルではなく、複数トンネルの冗長構成や閉域網接続(AWS Direct ConnectとGCP Carrier Interconnectの組み合わせ)とも比較してみたいですね!

参考URL