Cloud VPCを色々いじってみた

## 概要
GCPのサービスの一つである**Cloud VPC**を色々いじってみたので、その備忘録として実際に手を動かしたことをまとめていきます。
このまとめは、Cloud VPCについて勉強していたときに[この記事](https://medium.com/google-cloud-jp/gcp-%E3%81%AE%E7%B4%B0%E3%81%8B%E3%81%99%E3%81%8E%E3%81%A6%E4%BC%9D%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0-14ed12ebe84d)のわかりやすさに感化された自分が、実際にいろいろCloud VPCを使ってみたものです。なので説明部分で一部似通っている内容もありますがあしからず。

1. VPCの作成
2. vpc同士をVPCネットワークピアリングでつないでみる
3. 推移的ピアリングができないことを確認してみる
4. 内部IPが衝突するようなVPC同士でvpcピアリングをしてみる
5. vpc同士をCloud VPNでつないでみる
6. グローバル動的ルーティングを試す
7. 推移的ピアリングができることを確認してみる


## VPCの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/87116be7-785a-317a-ad2b-77293c39bfa1.png)
サブネット作成モードには`カスタム`と`自動`の2種類があります。
基本的に、VPCには一つ以上のサブネットを設定することができます。

カスタムモードの場合、自分でサブネットを設定します。
設定内容はリージョンとIPレンジで、IPレンジはもちろんプライベートIPの範囲を指定します。

自動モードを選択した場合、全リージョンにサブネットが自動生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/bab789f9-4157-a8d4-b917-fb692965213b.png)

これからいろいろ試していく上で以下のように`custom-asia`,`custom-us`,`custom-europe`の3つのVPCを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/906efabf-51b2-f23b-c41e-6071297dc758.png)

custom-asiaだけサブネットを２つ作成しましたが、これは後でグローバル動的ルーティングを試すためあえて作成しています。

## vpc同士をVPCネットワークピアリングでつないでみる
現状はどのVPCももちろんネットワークが形成されていないため互いに疎通ができません。そこで、VPC同士をVPCネットワークピアリングでつなぐと互いに内部IPで疎通することができるようになります。ということで、試しに`custom-asia`と`custom-us`を疎通させてみます。

VPCネットワークピアリングについては[こちら](https://cloud.google.com/vpc/docs/vpc-peering?hl=ja)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/f883c920-94ed-7416-8514-62c81a9e53ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/2e6fe11f-b899-42e6-1bad-e1c2f132cab6.png)
asia→usとus→asiaの２つのピアリングを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/913d43f9-7e49-bb0b-5659-88cc563d3311.png)
２つの作成が完了すると、ステータスが有効になります。
試しに、各VPC上にインスタンスを生成して内部IPで疎通できるか確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/45618051-765d-a811-4def-fe8d884d74f1.png)

ちなみに自分でVPCを作成した場合、ファイアウォール設定がないのでsshやpingができない状態です。そのため、作成したVPCに22番ポートとicmpの許可をする設定を事前に追加しています。

`instance-asia→instance-us`

```
instance-asia:~$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=120 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=120 ms
64 bytes from 10.0.2.2: icmp_seq=3 ttl=64 time=120 ms
64 bytes from 10.0.2.2: icmp_seq=4 ttl=64 time=120 ms
64 bytes from 10.0.2.2: icmp_seq=5 ttl=64 time=120 ms
64 bytes from 10.0.2.2: icmp_seq=6 ttl=64 time=120 ms
^C
--- 10.0.2.2 ping statistics ---
7 packets transmitted, 6 received, 0% packet loss, time 17ms
rtt min/avg/max/mdev = 119.528/119.594/119.666/0.323 ms
```

`instance-us→instance-asia`

```
instance-us:~$ ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=123 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=122 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=122 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=122 ms
64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=122 ms
64 bytes from 10.0.0.2: icmp_seq=6 ttl=64 time=122 ms
^C
--- 10.0.0.2 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 12ms
rtt min/avg/max/mdev = 122.061/122.271/123.063/0.538 ms
```

どちらも内部IPで疎通できることが確認できました。:tada:

## 推移的ピアリングができないことを確認してみる
VPCネットワークピアリングは推移的ピアリングはサポートされていなません。
図で表すと以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/107fd8f7-9c0a-be93-dc7f-a5492b9855e0.png)

今回は以下のような構築をしてこれを確かめてみたいと思います。
さきほどのピアリングを残して、新たに`custom-asia`と`custom-europe`のピアリングを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/2cfa1783-e8cd-e757-6599-6dd4d8017dd4.png)
インスタンスの情報は以下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/cc790b8e-51dc-8545-775d-cd4a8c5628ed.png)


`custom-europe→custom-asia`はもちろん疎通できます。

```
instance-europe:~$ ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=259 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=258 ms
^C
--- 10.0.0.2 ping statistics ---
3 packets transmitted, 2 received, 33.3333% packet loss, time 5ms
rtt min/avg/max/mdev = 257.555/258.308/259.062/0.908 ms
```

しかし、`custom-europe→custom-us`はというと

```
instance-europe:~$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
^C
--- 10.0.2.2 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 114ms
```
確かに疎通できないことが確認できました。

## 内部IPが衝突するようなVPC同士でvpcピアリングをしてみる
VPCネットワークピアリングは、ピアリングする２つのVPCのサブネットの内部IPが衝突している場合は作成できないらしいので、その確認をしてみます。
試しに、`custom-us`に`custom-asia`と衝突するように`10.0.0.0/29`のサブネットを追加してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/1144ac15-b787-b3e8-3ab6-73c500f75b9d.png)

`subnet-conflict`を`custom-us`に作成しました。

VPCネットワークピアリングしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/3488ee02-0236-9c5c-e604-e675c9e67b1c.png)

`10.0.0.0/29`が衝突してるため作成できないことが確認できました。:tada:


## vpc同士をCloud VPNでつないでみる
vpc同士をCloud VPNで疎通させることもできます。しかし、

- VPCネットワークピアリングよりも管理・作成にコストがかかる
- VPCネットワークピアリングと違って公共のネットワークを利用する(IPsec VPN)

以上の理由から、Cloud VPN同士の疎通の場合はVPCネットワークピアリングが推奨されてます。
なので一般的には**オンプレミス環境や他プロバイダのVPCとCloud VPCをつなぐものとして利用するのが適切なサービスとなります**が、後述するメリットもありますので実際に構築してみます。

Cloud VPNについては[こちら](https://cloud.google.com/vpn/docs/concepts/overview?hl=ja)

今回は試しに作ってみるだけなので、HA構成ではなくClassic構成で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/76e40f5d-af8a-6b43-e139-29d694f68175.png)

ここから先の作成方法は[この記事](https://medium.com/google-cloud-jp/gcp-%E3%81%AE-cloud-vpn-%E3%81%A7-vpc-%E5%90%8C%E5%A3%AB%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90-9be3ef72af17)に詳しく載ってますのでここでは割愛します。

というわけで`custom-asia/asia-northeast←→custom-europe/europe-north`のVPNを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/3ce44c32-4f72-f2b4-22a8-31ab8f694b21.png)

実際に疎通確認してみると

```
instance-asia:~$ ping 10.0.3.2
PING 10.0.3.2 (10.0.3.2) 56(84) bytes of data.
64 bytes from 10.0.3.2: icmp_seq=1 ttl=62 time=260 ms
64 bytes from 10.0.3.2: icmp_seq=2 ttl=62 time=257 ms
64 bytes from 10.0.3.2: icmp_seq=3 ttl=62 time=257 ms
^C
--- 10.0.3.2 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 4ms
rtt min/avg/max/mdev = 257.054/257.956/259.645/1.330 ms
```

```
instance-europe:~$ ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=62 time=260 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=62 time=257 ms
^C
--- 10.0.0.2 ping statistics ---
3 packets transmitted, 2 received, 33.3333% packet loss, time 5ms
rtt min/avg/max/mdev = 257.115/258.422/259.730/1.402 ms
```

互いに問題なく疎通ができました。:tada:

先程しれっと`custom-asia`の`asia-east`のサブネットにもインスタンスを作成しましたので、そのインスタンスとeuropeの疎通ができるか確認してみます。

```
instance-asia-2:~$ ping 10.0.3.2
PING 10.0.3.2 (10.0.3.2) 56(84) bytes of data.
^C
--- 10.0.3.2 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 33ms
```
先ほど作成したVPNは`asia-northeast`と`eeurope-north`のトンネルなので`asia-east`に作成したインスタンスとは疎通はできません。ただ、後述するグローバル動的ルーティングをオンにするとそれができるようになります。


## グローバル動的ルーティングを試す
`custom-asia`にグローバル動的ルーティングをオンにすると、**Cloud RouterがVPCのネットワーク全体をアドバタイズするようになる**ので、`asia-east←→europe-north`の疎通もできるようになるはずなので試してみます。
グローバル動的ルーティングについては[こちら](https://cloud.google.com/router/docs/how-to/configuring-routing-mode?hl=ja)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/ec6c80ea-d418-07b5-ec63-9e906cf14451.png)

変更内容はこの部分だけです。
VPN作成時に、使用可能なすべてのサブネットをアドバタイズするように設定していれば、勝手にコンソールにも反映されるようになります。

グローバル動的ルーティングがオフの時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/9febf279-73f9-81f0-e91b-9a752f9ddca2.png)

グローバル動的ルーティングがオンになった後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/17b4b2a2-ea9e-5e3b-500a-5cfde1e9b208.png)

`asia-east←→europe-north`が疎通できるか確認してみます。

```
instance-asia-2:~$ ping 10.0.3.2
PING 10.0.3.2 (10.0.3.2) 56(84) bytes of data.
64 bytes from 10.0.3.2: icmp_seq=1 ttl=62 time=295 ms
64 bytes from 10.0.3.2: icmp_seq=2 ttl=62 time=292 ms
64 bytes from 10.0.3.2: icmp_seq=3 ttl=62 time=292 ms
^C
--- 10.0.3.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 292.264/293.142/294.775/1.313 ms
```

```
instance-europe:~$ ping 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=62 time=295 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=62 time=292 ms
64 bytes from 10.0.1.2: icmp_seq=3 ttl=62 time=292 ms
^C
--- 10.0.1.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 292.277/293.267/295.118/1.451 ms
```

双方向で疎通できました。:tada:

## Cloud VPNで推移的ピアリングができることを確認してみる
**※設定してみてもどうもうまくいかなかったので、あまり参考にしないほうが良いかもです。**
ここがgcpのvpc同士をCloud VPNで接続するメリットらしいです。Cloud VPNで疎通させると推移的ピアリングが可能になるため、スター型のネットワークを構築することで、離れているVPC同士でも疎通ができるようになります。メッシュ状にピアリングを張り巡らせなければいけないVPCネットワークピアリングよりもラクに作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/45cfdc8a-04c0-7857-944b-244394ebf869.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/eade541e-02a9-aef4-1a47-4e10f71193b7.png)

パブリックIPを隠してるので分かりづらいかもしれませんが、

- custom-asia←→custom-europe
- custom-asia←→custom-us

の２つのVPNが張られている状態で、それぞれにVPNトンネルがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178971/50c4a398-5498-ae26-68d2-c63fe4a4d4e3.png)
`asia`からそれぞれ`us`,`europe`に向いてるトンネルは一つのCloud Routerから伸びていて、本来であればこの時点で`custom-europe←→custom-us` の疎通ができるはずなのですが自分はこれができず、詰まってしまいました。わかる方いましたら教えていただきたいです。:pray:


## まとめ
共有VPCについても触れたかったのですが、組織の作成がシュッとできるものではなかったのでパスしてます。
個人開発ではVPC周りはなかなか触れない箇所なので一通りやってみて結構面白かったです。
家のネットワークとVPNでつないで色々やってみたいなぁ。