【初心者】AWS Site-to-Site VPN を使ってみる (GCPとのVPN接続)

# 1. 目的

- AWSのネットワーク関連の復習をしている。サイト間VPN(AWS Site-to-Site VPN)について、実機での設定を行い基本的な仕組みを理解する。

# 2. やったこと

- AWS / GCP間でVPN接続を行い、AWSのインスタンスとGCPのインスタンス間の通信ができることを確認する。
- 対向のGCP側でもマネージドのVPNサービス(Cloud VPN)を使用する。

# 3. Site-to-Site VPN とは(自分の理解)
- AWSと、オンプレミスや他のクラウドとの間をインターネット経由で、VPNを設定して、セキュアに接続するサービス。

# 4. 予習
- やり方が分かりやすくまとまっているサイトがいくつかあったので、まずそれらを見て概念を理解する。
    - [AWS VPC と GCP VPC を VPN 接続するための設定例](https://www.qoosky.io/techs/c11188b146)
        - AWS/GCP両側での設定の手順が分かりやすく整理されており、このサイトの手順を参考に実施する。
        - このサイトではAWS側はトランジットゲートウェイを使用する手順としているが、自分としては仮想プライベートゲートウェイ(VGW)のほうが利用頻度が高そうなため、今回はVGWを使用。
    - [AWSとGCPのVPN接続を複数パターン試してみる（高可用性（HA）VPN編）](https://dev.classmethod.jp/articles/aws_gcp_vpn/)
        - VPNトンネルの使い方のパターンなどが詳細に説明されており参考になる。今回は、一番きちんと構成するパターン(VPNトンネルを4本張るパターン)でやってみることにする。

# 5. 構成図

![構成図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d533cb76-ff0c-1a3a-9000-6c5e7799084d.png)

- 全体的には、AWS側では仮想プライベートゲートウェイ(VGW)など、GCP側ではCloud VPN、Cloud Routerなどを構成し、それぞれでVPN終端を行い、AWS側VPC内のインスタンスと、GCP側VPCネットワーク内のインスタンスが通信できるようにする。

![構成図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/05c7efac-d345-55d2-81be-f25c321d98e0.png)

- VPNトンネルの構成としては、AWS/GCPそれぞれで自分側のリソースを作成し、対向側のリソースを接続先として登録しあうイメージ。

# 6. 手順

## 6.1 【AWS側】VPC、サブネット作成
- VPC(10.0.0.0/16)、パブリックサブネット(10.0.0.0/24)を作成する。(詳細手順省略)

## 6.2 【GCP側】VPCネットワーク、サブネット作成
- 1個のサブネット(10.1.0.0/24)を持つVPCネットワークを作成する。

![s2s-01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1b1bef88-e747-ea5c-9b02-2632f92b6f23.png)

## 6.3 【GCP側】Cloud HA VPN ゲートウェイ作成
- GCP側のマネージドVPNサービス(Cloud VPN)の、「Cloud HA VPN ゲートウェイ」を作成する。「Cloud HA VPNゲートウェイ」は、VPNを終端する仮想的なGWで、AWSのVGWに相当するようなもの。
- 「VPNの作成」- 「高可用性(HA)VPN」を選択する。せっかくなのでBGPの利用含めた推奨構成でやるため。

![s2s-02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4e1dba56-92f6-258c-3409-ff47433eacdd.png)

- あらかじめ作成したVPCネットワークを選択してCloud HA VPNゲートウェイを作成する。


![s2s-03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a541c40b-4c69-4a78-036c-f03e681f5c4c.png)


- 対向のAWS側は未設定であり、次の手順内容であるピアVPNゲートウェイの設定はまだできないため、ここでいったんキャンセルする。
- ここで生成された、Cloud HA VPNゲートウェイのグローバルIPアドレス(2個)をメモしておく。(AWS側での設定で使用するため)


![s2s-04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6ba4cb04-0563-257d-c357-9dc91b5c5602.png)


## 6.4 【GCP側】Cloud Router作成
- AWSとのVPN接続においてBGPを使用するため、Cloud Routerを作成する。(BGPを使うにはCloud Routerが必要)
- GCP側のASNを64513とする。

![s2s-05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d9102293-ef8e-04b1-3dbd-230c637ae2e1.png)

## 6.5 【AWS側】カスタマーゲートウェイ(CGW)作成
- GCP側で作成した「Cloud HA VPN ゲートウェイ」のグローバルIPアドレス(2個)を、それぞれカスタマーゲートウェイ(CGW)として登録する。
- CGWはVGWとVPN接続を張るための、AWSから見て対向側のVPN終端装置、というイメージ。
- 「Cloud HA VPN ゲートウェイ」のグローバルIPアドレス、およびGCP側のASN(64513)を指定してCGWを作成する。(下の画面は1個目の作成画面。2個目も同様に作成する。)
- ARN証明書の設定は不要。(今回は証明書を使ってVPN接続するわけではないため)

![s2s-06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a7f09a4c-6275-6d92-5720-be3003efd516.png)

## 6.6 【AWS側】仮想プライベートゲートウェイ(VGW)作成
- AWS側のASN(64512)を指定して、仮想プライベートゲートウェイ(VGW)を作成する。

![s2s-07a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b2eb0357-b698-df31-7724-b504fff55ed3.png)

- VGWをあらかじめ作成しておいたVPCにアタッチする。

![s2s-08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/aaabde5e-316f-3668-e9cb-5a29aeaf62a2.png)

## 6.7【AWS側】VPN接続の作成
- VGWとCGW1個目(=GCP側の「Cloud HA VPN ゲートウェイ」の1個目のアドレス)を指定して、VPN接続を作成する。(下の画面は1個目の作成画面。CGW2個目を指定して同様にVPN接続をもう1個作成する。)
- 「VPN接続」を1つ作成すると、その中にVPNトンネルが2つ作成される。

![s2s-09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/61a315c1-7df6-1e65-bd27-21f06edb5026.png)

![s2s-10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/601ccf3a-77bd-88d4-1e9f-7cb8c4614052.png)


- 作成したVPN接続を選択し、設定ファイルをダウンロードする。
- 生成された設定ファイルの中に、Pre-Shared Keyなど、GCP側とトンネルを確立するのに必要な情報が含まれている。

![s2s-11a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c18791cc-1cab-1c46-df9a-e44fdd609bf9.png)

![s2s-12a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/958e4c0b-1d9b-75b7-9cf7-c93c80feb929.png)

## 6.8 【GCP側】ピアVPNゲートウェイ作成

- ピアVPNゲートウェイ(=GCP側から見ての対向VPN終端装置であり、AWSでいうところのCGWのようなもの)を作成する。
- AWS側で「VPN接続」を2つ作成した時に計4つグローバルIPアドレスがアサインされており、それらを1つずつピアVPNゲートウェイとして登録する。

![s2s-13a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b32494ec-cb2f-5b63-6ee3-90e3fd9e89a7.png)

## 6.9 【GCP側】VPNトンネル作成

- GCP側のVPN終端装置である「Cloud HA VPN ゲートウェイ」と、AWS側のVPN終端装置である「ピアVPNゲートウェイ」を接続するVPNトンネルを作成する。
- 「Cloud HA VPN ゲートウェイ」、「ピアVPNゲートウェイ」はそれぞれ事前に作成したものを指定する。
- AWS/GCP間を推奨構成で接続するため、「VPNトンネルを4つ作成する」を指定する。
- ルーティングにBGPを使用するため、事前に作成したCloud Routerを指定する。
- VPNトンネルを4つ作成する。IKE事前共有キーは、AWS側でVPN接続を作成した際に生成された設定ファイルに記載されているものを設定する。

![s2s-14a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c4b9b412-97b8-3716-7bc7-5494bb90c75f.png)
![s2s-15a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/f08f1cc8-b210-0065-bf50-ee4cf68b4acd.png)

## 6.10 【GCP側】BGPセッションの構成

- 4つのVPNトンネルでそれぞれBGPセッションの構成を行う。
- ピアASNはAWS側ASNである64512とし、Cloud Router及びBGPピアのIPアドレスは、AWS側でVPN接続を作成した際に生成された設定ファイルに記載されているもの(169.254.x.x)を使用する。MED、BFDなどは今回は指定していない。
- BGPセッションの設定後、AWS側との接続が確立されていることが確認できる。

![s2s-16a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/14bda015-64b9-11c6-de99-559d7880e975.png)

![s2s-17a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b17f09ba-3f98-464c-cbe1-1b975835a2ee.png)

![s2s-18a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/32f1a316-6f9d-d673-3a86-031b02552996.png)

## 6.11 【AWS側】ステータス確認

- VPN接続がAvailableに、トンネルもUpになっていることが確認できる。

![s2s-19a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/daa94217-1a65-563b-e802-33abab639861.png)


## 6.12 【AWS側/GCP側】その他の設定・疎通確認
- AWS側で、GCP側(10.1.0.0/24)への経路(ターゲットはVGW)をサブネットのルートテーブルに追加する。

![s2s-20a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/bc2df6a8-cf9e-58ad-8221-3638c4a561cf.png)

- GCP側で、AWS側(10.0.0.0/16)へのルーティングが動的に設定されていることを確認する。

![s2s-21a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ce5ce55e-0744-5894-589b-260c448fb861.png)

- AWS側、GCP側 それぞれにインスタンスを作成する。
- AWS側でのセキュリティグループで10.1.0.0/24からのアクセス、GCP側のファイアウォールで10.0.0.0/24からのアクセスが許可されていることを確認する。
- AWSのインスタンスとGCPのインスタンス間でping可能なことを確認する。(以下はAWS側インスタンスからのping)

```
[ec2-user@ip-10-0-0-27 ~]$ ping 10.1.0.2
PING 10.1.0.2 (10.1.0.2) 56(84) bytes of data.
64 bytes from 10.1.0.2: icmp_seq=1 ttl=63 time=15.5 ms
64 bytes from 10.1.0.2: icmp_seq=2 ttl=63 time=7.67 ms
64 bytes from 10.1.0.2: icmp_seq=3 ttl=63 time=7.55 ms
64 bytes from 10.1.0.2: icmp_seq=4 ttl=63 time=7.66 ms
64 bytes from 10.1.0.2: icmp_seq=5 ttl=63 time=7.84 ms
^C
--- 10.1.0.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 7.554/9.248/15.501/3.128 ms
[ec2-user@ip-10-0-0-27 ~]$
```

# 7. 所感
- だいぶ長くなってしまったが、一通りの設定プロセスを確認することができた。余裕があればAzureとの接続など、各種パターンを確認してみたい。