AWSとGCPをVPNでつないでみる

# はじめに
AWSとGCPで機密度の高いデータをなるべく安全な形でやり取りしたいなあ、となったら・・・
ということでAWSとGCPでVPN接続を行なってデータのやり取りができるかを試してみる。

AWSならVPCエンドポイント、GCPならAccess Context ManagerとVPC Service Controlsを組み合わせれば、パブリックアクセス不可なS3からGCSへデータをコピー・・・とかもできるはず。


# VPN設定をやっていく
## VPN接続の準備
- （注意点）AWSとGCPの手順が入り組んでいます！というのも双方の設定を入れていく必要があるため。
- とりあえずのトライ、なので冗長化は今回は考慮しない。

### [AWS]VPC、サブネットの作成 ※用意してない場合のみ
- CIDRや名前などは適宜変えてください。

```
aws ec2 create-vpc --cidr-block xx.xx.xx.xx/16
aws ec2 create-tags --resources vpc-XXXXXXXXXXXXXXXXX --tags Key=Name,Value=TEST-VPC
```

```
aws ec2 create-subnet --vpc-id vpc-XXXXXXXXXXXXXXXXX --cidr-block xx.xx.xx.xx/24
aws ec2 create-tags --resources subnet-XXXXXXXXXXXXXXXXX --tags Key=Name,Value=TEST-VPC-TEST-1
```

### [GCP]VPCネットワークの準備 ※用意してない場合のみ
```
$ gcloud compute networks create [NETWORK_NAME] --subnet-mode=custom --bgp-routing-mode=regional
$ gcloud compute networks subnets create [SUBNET_NAME] --network=[NETWORK_NAME] --range=[PRIMARY_RANGE] --region=[REGION]
$ gcloud compute firewall-rules create [FIREWALL_NAME] --network [NETWORK_NAME] --allow tcp:22 --source-ranges [IP_RANGE]
```

### [GCP]クラウドルーターの作成
```
$ gcloud compute routers create my-router --network [NETWORK_NAME] --asn 65000 --region asia-northeast1
```

### [GCP]VPNトンネルの設定
- ハイブリッド接続 -> VPN -> 「VPN接続を作成」を選択
 - VPNオプションは「高可用性（HA）VPN」のほうで作成しています。

- Cloud HA VPNゲートウェイの作成
 -　VPNゲートウェイの名前：適当な名前を入力
 - ネットワーク：VPN接続したいネットワークを選択
 - リージョン：今回はasia-northeast1(東京)で作成
 - 上記を入力し終えたら、「作成して続行」を選択
- VPNトンネルの追加
 - **ここの設定を追加する前に、表示されているインターフェースのIPアドレスを控えてAWSの手順へ移ります。**
![awstogcp-vpn-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/09d62eb9-840e-06a0-8f63-05b1616541fe.png)


### [AWS]カスタマーゲートウェイの作成
- public-ipの引数には先ほど作成途中のGCPのVPNゲートウェイのインターフェースIPアドレスを指定。

```
$ aws ec2 create-customer-gateway --type ipsec.1 --public-ip xx.xx.xx.xx --bgp-asn 65000
```

### [AWS]仮想プライベートゲートウェイの作成
```
$ aws ec2 create-vpn-gateway --type ipsec.1
```

### [AWS]仮想プライベートゲートウェイをVPCにアタッチ
```
$ aws ec2 attach-vpn-gateway --vpc-id [接続するVPCのID] --vpn-gateway-id [作成した仮想プライベートゲートウェイのID]
($ aws ec2 attach-vpn-gateway --vpc-id vpc-XXXXXXXXXXXXXXXXX --vpn-gateway-id vgw-XXXXXXXXXXXXXXXXX)
```

### [AWS]サイト間VPN接続の作成
- VPC -> サイト間のVPN接続 -> VPN接続の作成
 - 名前タグ：名前を入力
 - Target Gateway Type：Virtual Private Gateway
 - 仮想プライベートゲートウェイ：作成済みの仮想プライベートゲートウェイを選択
 - カスタマーゲートウェイ：既存
 - Customer Gatewat ID：作成したカスタマーゲートウェイを選択
 - 以降はデフォルトのままとし、作成
![awstogcp-vpn-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/4622b54d-4087-e9e8-df82-121fa9b3893f.png)


### [AWS]サイト間VPN設定のダウンロード
- サイト間VPN接続設定のステータスが使用可能の状態になってから作業
- 作成済みのサイト間VPN接続設定を選択し、「設定のダウンロード」を選択
 - ベンダーを「Generic」にしてダウンロードを選択するとテキストファイルがダウンロードされる

### [GCP]VPNトンネルの設定(続きから)
- 新しいピアVPNゲートウェイを作成するを選択
 - 名前：適当な名前を入力
 - インターフェース（今回は1つのインターフェース）：ダウンロードしたAWS側の設定テキストの [Outside IP Addresses] - [Virtual Private Gateway]の値を入力
![awstogcp-vpn-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/35772b7b-2dec-1d71-fcc3-2729626b4b08.png)
- VPNトンネルの追加の画面に戻り、下記設定値を入力していく
 - Cloud Router：作成済みのルータを選択
 - 名前：適当な名前を入力
 - IKEバージョン：「IKEv1」を選択
 - IKE事前共有キー：テキストの [Pre-Shared Key]の値を入力
 - ここまで終えたら、「作成して続行」を選択
![awstogcp-vpn-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/0c802535-458b-77a3-1a6e-3801c1fbe26c.png)
- BGPセッションの構成
 - 構成を選択し、BGPセッションの編集に移る
 - 名前：適当な名前を入力
 - ピアASN：テキストの [Virtual Private  Gateway ASN]の値を入力（64215）
 - Cloud Router のBGP IP：テキストの [Inside IP Addresses] - [Customer Gateway]の値を入力
 - BGPピアIP：テキストの [Inside IP Addresses] - [Virtual Private Gateway]の値を入力
 - ここまで終えたら、「BGP構成を保存」を選択
![awstogcp-vpn-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/e80d2260-b4fc-563c-4fce-30a24b019854.png)

## 設定値の確認
- 最終的にAWS、GCPの設定が下記のようになっていればVPN接続できている。
![awstogcp-vpn-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/2bf48fb5-12b9-e45a-53ef-73ac387a5438.png)
![awstogcp-vpn-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/43f9b4e7-87c9-8f34-bd1e-b2e980414aed.png)

- AWS側でトンネルのステータスがアップにならない場合、ルートテーブルのルート伝播が「はい」になっているかを確認。
 - ルートテーブル -> ルート伝播タブ

![awstogcp-vpn-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96973/2da134ac-a214-d28a-d469-ea1cc96846b6.png)


## インスタンスを利用したVPN接続の確認
- AWS側に用意したEC2インスタンスとGCP側に用意したVMインスタンスを使って、ローカルIPアドレスで接続できるかを確認。
 - ファイアウォールなどは適宜変えてください。

## VPN接続の切断
- データ転送の有無にかかわらず、接続しているだけでもAWSとGCPの双方でコストがかかるので、不要な時は設定をなくしておくのがベスト。
- 再度接続するときには、トンネルなどの設定を作成し、VPN接続を確立する。

### [AWS]サイト間のVPN接続設定の削除
- 管理コンソールから設定を削除

### [GCP]Cloud VPN トンネル設定の削除
- 管理コンソールから設定を削除

## まとめ
- とりあえずAWSとGCPをVPN接続でつないでみました。このあたりのインターフェースなどは結構頻繁に変わるためどういった設定が必要かを熟知しておく必要がある。
- 料金のことを考えると、おなじ東京リージョン同士を選択したり、必要なタイミングのみ設定を入れたり、転送するデータ量なども気を付けたほうが良い、、、

---
[:christmas_tree: FORK Advent Calendar 2020](/advent-calendar/2020/fork)
:arrow_left: 21日目 [ml5.js の FaceApi で遊んでみる](/kinoleaf/items/f73b465c0d20a50b8cf7) @kinoleaf
:arrow_right: 23日目 [技術書 2020](/dashimakitamago/items/9baec545c54c74ccfd5d) @dashimakitamago