[IPSec-VPN] クラウド間(GCP⇔AWS)通信

# プロローグ
**GCP**(Google Cloud Platform)と**AWS**(Amazon Web Service)の間のSite-to-Site VPN通信（クラウド間VPN通信）は、**超簡単にできる**！

- GCPの「VPN接続」機能とAWSの「VGW(Virtual Private GW)」は、直結可能！
- Azureの「仮想ネットワークゲートウェイ」とAWSのVGWは、（数年前は）繋げなかった...
    - 確か「どちらが先にグローバルIPアドレスを払い出す？」問題。
    - ARM版では未検証。
- AWSのように[Windows-VPN](http://qiita.com/coga2000/items/41edef9b7dee2f997a1a)を試してみたが、不発...
    - 詳細は（エピローグ中の）「gcpとAWSのNW観点の差異」をご参照。

# 手順
1. [gcp] 外部IPアドレス(以下、この値を*GIP*と呼ぶ)を取得する。
    - AWSのVGWはグローバルIPアドレスが自動的に割り振られる（＝Uncontrollable）なので、gcp側でControlする。
2. [AWS] *GIP*に相当するCGW(Customer Gateway)を作成する。
3. [AWS] VGWを作成し、VPCに紐づける。
    - このとき、VPCに紐づいているRouteTableにおいて、VGWの「Route Propagation」を「Yes」にしておくと、「AWS→gcp」のルートがAWS側に自動設定される。
4. [AWS] SecurityGroupを調整する。
    - gcp側のプライベートNWからの通信を受け付けるべく開ける(テスト用ICMPとか)。
5. [AWS] 上記のCGWとVGWをツナぐVPN Connection(VPNC)を作成する。
    - 「Routing Options」：まずは敷居の低い「**static**」で...
    - 「Static IP Prefixes」：gcp側のNWアドレス(CIDR)を指定。
6. [AWS] VPNCのConfigurationをDownloadする。
    - AWS側グローバルIPアドレス/Pre-Shared-Key(2つずつ)は、AWSが自動割り当てする（＝Uncontrollable）。
7. [gcp] VPN接続を作成する。
    - gcp側のIPアドレスとして「*GIP*」を設定。
![20170607_VPN接続の設定① - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/8182c053-18ba-ae25-4caf-960eb2a55835.jpeg)
    - AWS側がVPNトンネルを2つ用意しているので、**トンネル設定は2本分**設定。
    - 「IKEバージョン」：「**IKEv1**」を指定（「IKEv2」だと疎通しない。AWSが未対応？）。
    - 「事前共有シークレット」：AWSが自動割り当てしたPre-Shared-Key値を設定。
    - 「ルーティングオプション」：まずは敷居の低い「**静的**」で...
    - 「リモートネットワークIPの範囲」：AWS VPCのCIDRを指定。
    - トンネル1本目用の設定
![20170607_VPN接続の設定② - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/6108d994-c97f-f1ac-55e6-5df253f36ff4.jpeg)
    - トンネル2本目用の設定
![20170607_VPN接続の設定③ - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/82fb88ec-f3d0-c07c-7144-ef2cefa9c373.jpeg)

7. 「作成」ボタンを押し、下記の画面になればOK!!
![20170607_VPN接続の設定RES.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/4a3b9485-5b87-d35f-3079-71fc3f33ba1e.jpeg)

8. ICMPで疎通確認のためには、下記を確認：
    - AWS側のRouteTable（Propageted指定なら追加作業なし）
    - AWS側のSecurityGroup
    - gcp側のルート（VPN接続作成時に自動作成されているはずなので、追加作業なし）
    - gcp側のファイアウォールルール（サブNW作っているとハマりがちなので注意）

# エピローグ
## gcpとAWSのNW観点の差異
- gcpでは、~~ひとつのインスタンスは複数のNICを持つことはできない？（ひとつのNW/サブNWにしか収容できない？）~~
⇒複数NIC持つことできます。訂正。
⇒複数NICを持たせたうえで、Windows-VPNに再挑戦★

- gcpインスタンス上でipconfig/ifconfigを実行すると下記の結果が出てプチ衝撃：

```ruby:ipconfig
C:\>ipconfig
Windows IP Configuration

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : c.xxx.internal
   IPv4 Address. . . . . . . . . . . : 10.xxx.0.100
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . : 10.xxx.0.1

C:\>
```


```ruby:ifconfig
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP qlen 1000
    link/ether 42:01:0a:8c:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.xxx.0.2/32 brd 10.140.0.2 scope global dynamic eth0
       valid_lft 80364sec preferred_lft 80364sec
    inet6 fe80::xxxx:xxxx:xxxx:2/64 scope link 
       valid_lft forever preferred_lft forever
```

⇒サブネットマスクが「/32(IPv4)」「/64(IPv6)」？
⇒全てのインスタンスは、GWインスタンスに直接ぶら下がっている（ハブ＆スポーク構成）？

## AzureとAWSの間のSite-to-Site VPN通信（クラウド間VPN通信）
- ぱっと見たところ、Azure側仮想ネットワークゲートウェイにおいて、
    - パブリックIPアドレスは指定できる（「どちらが先にグローバルIPアドレスを払い出す？」問題は解消）。
    - Pre-Shared-Keyが指定可能か不可か、依然調査中...

## AWSリージョン間接続を、VGW同士で...
できないですよね。グローバルIPアドレス/Pre-Shared-Keyを自動で割り当てられてしまう（＝Uncontrollable）ので★

## 最後にひとこと
「gcpとAWSの間のSite-to-Site VPN通信」の方が「AWSのリージョン間のSite-to-Site VPN通信」よりもシンプル・早・易だと思いました♪