GCPのVPCネットワークを作成してみた

# 背景・目的
以前、[BigQueryを試してみた](https://qiita.com/zumax/items/1c81590e09e01b690345)という記事で、BQを試しましたが、GCPのネットワーク構成について理解していないままでした。
今回は、GCPのネットワークについて整理します。

# まとめ
特徴を下記にまとめます。

|特徴 | 説明 |
|:--|:--|
| VPCネットワーク| ・VPCネットワークは、Google本番環境NW内に実装された物理NWを仮想化したNWである<BR>・VPCは、[Andromeda](https://www.usenix.org/system/files/conference/nsdi18/nsdi18-dalton.pdf) を使用している<BR>・VMインスタンス向けの接続を提供する<BR>・ネイティブの内部パススルーネットワークLBと、内部アプリケーションLB用のプロキシーを提供<BR>・VPNトンネルとCloud Interconnect用のVLANアタッチメントを使用してオンプレに接続<BR>・GCPの外部ロードバランサからバックエンドにトラフィックを分散する|
|サブネット|・NWを使用するには、少なくとも1つのサブネットが必要<BR>・自動モードVPC、カスタムモードVPC、リージョンごとに複数のサブネットを作成できる|
|仮想マシンインスタンス|・VMインスタンスは、GCPでホストされる仮想マシン|
|VPCネットワークの仕様|・VPCネットワークは、グローバルリソース。特定リージョンやゾーンに関連付けられていない<BR>・サブネットはリージョンリソース<BR>・インスタンス間のトラフィックは、NWのFWルールで制御可能。ルールはVM自体に実装される<BR>・VPC NW内のリソースには、NW FWルールが適用される<BR>・内部IPｖ４、IPv6アドレスを持つインスタンスは、Google API、サービスと通信できる<BR>・NW管理は、IAMロールを使用して保護される<BR>・組織は、共有VPCを使用して、共通ホストプロジェクト内で、VPC NWを維持できる<BR>・VPCネットワークピアリングを使用して、異なるプロジェクトや組織のVPCネットワークとVPCネットワークを接続できる<BR>・ハイブリッド環境のVPCネットワークは、Cloud VPNまたは、Cloud Interconnectを使用して安全に接続できる|


# 概要
[VPC ネットワーク](https://cloud.google.com/vpc/docs/vpc?hl=ja)を元に整理します。

> Virtual Private Cloud（VPC）ネットワークは、Andromeda を使用して Google の本番環境ネットワーク内に実装された物理ネットワークを仮想化したネットワークです。

> VPC ネットワークは次のことを行います。

> - Compute Engine 仮想マシン（VM）インスタンス向けの接続を提供します。
> - ネイティブの内部パススルー ネットワーク ロードバランサと内部アプリケーション ロードバランサ用のプロキシ システムを提供します。
> - Cloud VPN トンネルと、Cloud Interconnect 用の VLAN アタッチメントを使用して、オンプレミス ネットワークに接続します。
> - Google Cloud の外部ロードバランサからバックエンドにトラフィックを分散します。

> プロジェクトには複数の VPC ネットワークを設定できます。この設定を禁止する組織のポリシーを作成しない限り、新しいプロジェクトは、各リージョンに 1 つのサブネットワーク（サブネット）を持つデフォルトネットワーク（自動モード VPC ネットワーク）が設定された状態で開始されます。

- VPCネットワークは、Google本番環境NW内に実装された物理NWを仮想化したNWである
- VPCは、[Andromeda](https://www.usenix.org/system/files/conference/nsdi18/nsdi18-dalton.pdf) を使用している
- VMインスタンス向けの接続を提供する
- ネイティブの内部パススルーネットワークLBと、内部アプリケーションLB用のプロキシーを提供
- VPNトンネルとCloud Interconnect用のVLANアタッチメントを使用してオンプレに接続
- GCPの外部ロードバランサからバックエンドにトラフィックを分散する

## ネットワークとサブネット
> サブネットとサブネットワークという用語は同義語です。Google Cloud コンソール、gcloud コマンド、API ドキュメントでは同じ意味で使用されます。
サブネットは（VPC）ネットワークと同じではありません。Google Cloud では、ネットワークとサブネットは異なる種類のリソースです。

- ネットワーク＝サブネット

### サブネット
[サブネット](https://cloud.google.com/vpc/docs/subnets?hl=ja)を元に整理します。

> ネットワークを使用するには、そのネットワークに少なくとも 1 つのサブネットが必要です。自動モード VPC ネットワークは、各リージョンのサブネットを自動的に作成します。カスタムモード VPC ネットワークはサブネットなしで開始し、サブネットの作成を完全に制御できます。リージョンごとに複数のサブネットを作成できます。自動モード VPC ネットワークとカスタムモード VPC ネットワークの違いについては、VPC ネットワークの種類を参照してください。

- NWを使用するには、少なくとも1つのサブネットが必要
- 自動モードVPC
    - 各リージョンのサブネットを自動的に作成する
- カスタムモードVPC
    - サブネットなしで開始。サブネットの作成を完全に制御する
- リージョンごとに複数のサブネットを作成できる

> Google Cloud でリソースを作成する場合は、ネットワークとサブネットを選択します。インスタンス テンプレート以外のリソースの場合は、ゾーンまたはリージョンも選択します。ゾーンを選択すると、その親リージョンが暗黙的に選択されます。サブネットはリージョン オブジェクトであるため、リソースに選択したリージョンによって、使用できるサブネットが決まります。

- ゾーンまたはリージョンを選択する
- ゾーンを選択すると、その親リージョンが暗黙的に選択される
- サブネットはリージョンオブジェクト

### サブネットの目的
> サブネットはさまざまな目的で使用できます。

> - 通常のサブネット: これはデフォルトのサブネット タイプです。通常のサブネットは、ユーザーによって作成されるか、VM インスタンスで使用するために自動モード ネットワークで自動的に作成されます。通常のサブネットの目的は、gcloud CLI または API で PRIVATE にすることです。Google Cloud コンソールでは、この目的は [なし] です。
> - Private Service Connect サブネット: Private Service Connect を使用してマネージド サービスを公開するために使用するサブネットです。
> - プロキシ専用サブネット: リージョンの Envoy ベースのロードバランサで使用するプロキシ専用サブネットです。
> - Private NAT サブネット: Private NAT のソース範囲として使用するために予約されるサブネット。このサブネットは --purpose=PRIVATE_NAT に設定されています。

- 通常のサブネット
- Private Service Connectサブネット
- プロキシ専用サブネット
- Private NATサブネット

## 仮想マシン インスタンス
[仮想マシン インスタンス](https://cloud.google.com/compute/docs/instances?hl=ja)を元に整理します。

> Compute Engine 仮想マシン（VM）インスタンスは、Google のインフラストラクチャでホストされる仮想マシンです。Compute Engine インスタンス、VM インスタンス、VM は同じことを指す用語であり、Google Cloud コンソール、Google Cloud CLI リファレンス、API ドキュメントでは同じ意味で使用されます。

> VM インスタンスには、Google Kubernetes Engine（GKE）クラスタ、App Engine フレキシブル環境インスタンス、Compute Engine VM 上に構築された他の Google Cloud プロダクトが含まれます。

- VMインスタンスは、GCPでホストされる仮想マシン
- VMインスタンスは、GKEクラスタ、App Engineフレキシブル環境インスタンス、Compute Engine VM上記に構築された他のGoogle Cloud プロダクトが含まれる

### インスタンスとプロジェクト
> 各インスタンスは Google Cloud コンソール プロジェクトに属し、プロジェクトには 1 つ以上のインスタンスを含めることができます。プロジェクトでインスタンスを作成する場合は、ゾーン、オペレーティング システム、そのインスタンスのマシンタイプを指定します。インスタンスを削除すると、プロジェクトから削除されます。

### インスタンスとストレージ オプション
> デフォルトでは、Compute Engine インスタンスごとに、オペレーティング システムを格納する小規模なブート永続ディスクが割り当てられます。インスタンス上で動作するアプリケーションでストレージ容量がさらに必要になった場合は、インスタンスにストレージ オプションを追加できます。


### インスタンスとネットワーク
> Compute Engine インスタンスの各ネットワーク インターフェースは、固有の VPC ネットワークのサブネットに関連付けられます。VPC の詳細については、ネットワークの概要と VPC の割り当てをご覧ください。

### インスタンスとコンテナ
> Compute Engine インスタンスは、コンテナを使用してアプリケーションを起動する宣言的な方法をサポートしています。VM またはインスタンス テンプレートを作成するときに、Docker イメージ名と起動構成を指定できます。残りは Compute Engine が処理します（Docker がインストールされた最新のContainer-Optimized OS イメージを提供し、VM が起動するときにコンテナを起動するなど）。詳しくは、VM とマネージド インスタンス グループ（MIG）へのコンテナのデプロイをご覧ください。




## 仕様
> VPC ネットワークの特性は次のとおりです。
> - 関連ルート、ファイアウォール ルールを含む VPC ネットワークはグローバル リソースです。特定のリージョンやゾーンには関連付けられていません。
> - サブネットはリージョン リソースです。
> - サブネットごとに IPv4 アドレスの範囲が定義されます。カスタムモードの VPC ネットワーク内のサブネットには、IPv6 アドレスの範囲も設定できます。
> - インスタンス間のトラフィックは、ネットワークのファイアウォール ルールで制御できます。ルールは VM 自体に実装されるため、トラフィックは VM から離れるとき、または到着するときにのみ制御され、ログに記録されます。
> - VPC ネットワーク内のリソースには、ネットワーク ファイアウォール ルールが適用されます。こうしたリソースは、内部 IPv4 アドレス、内部 IPv6 アドレス、または外部 IPv6 アドレスを使用して相互に通信できます。詳細については、ネットワーク内の通信をご覧ください。
> - 内部 IPv4 アドレスや IPv6 アドレスを持つインスタンスは、Google API およびサービスと通信できます。詳細については、サービスのプライベート アクセス オプションをご覧ください。
> - ネットワーク管理は、Identity and Access Management（IAM）のロールを使用して保護できます。
> - 組織は共有 VPC を使用して、共通ホスト プロジェクト内で VPC ネットワークを維持できます。同じ組織内の他のプロジェクトの承認済み IAM プリンシパルは、共有 VPC ネットワークのサブネットを使用するリソースを作成できます。
> - VPC ネットワーク ピアリングを使用して、異なるプロジェクトや組織の VPC ネットワークと VPC ネットワークを接続できます。
> - ハイブリッド環境の VPC ネットワークは、Cloud VPN または Cloud Interconnect を使用して安全に接続できます。
> - VPC ネットワークは GRE トラフィックをサポートします。これには、Cloud VPN と Cloud Interconnect 上のトラフィックも含まれます。VPC ネットワークでは、Cloud NAT で GRE がサポートされていません。また、負荷分散とプロトコル転送で転送ルールはサポートされません。GRE のサポートにより、インターネット（外部 IP アドレス）と Cloud VPN または Cloud Interconnect（内部 IP アドレス）から VM への GRE トラフィックを終了できます。カプセル化解除されたトラフィックは到達可能な宛先に転送できます。GRE を使用すると、セキュア アクセス サービスエッジ（SASE）や SD-WAN などのサービスを使用できます。
> - VPC ネットワークは、IPv4 と IPv6 のユニキャスト アドレスをサポートしています。VPC ネットワークは、ネットワーク内のブロードキャスト アドレスまたはマルチキャスト アドレスをサポートしません。

- VPCネットワークは、グローバルリソース。特定リージョンやゾーンに関連付けられていない
- サブネットはリージョンリソース
- インスタンス間のトラフィックは、NWのFWルールで制御可能。ルールはVM自体に実装される
- VPC NW内のリソースには、NW FWルールが適用される
- 内部IPｖ４、IPv6アドレスを持つインスタンスは、Google API、サービスと通信できる
- NW管理は、IAMロールを使用して保護される
- 組織は、共有VPCを使用して、共通ホストプロジェクト内で、VPC NWを維持できる
- VPCネットワークピアリングを使用して、異なるプロジェクトや組織のVPCネットワークとVPCネットワークを接続できる
- ハイブリッド環境のVPCネットワークは、Cloud VPNまたは、Cloud Interconnectを使用して安全に接続できる

## VPCネットワークの例
２つのリージョンに③つのサブネットがあるカスタムモードVPCネットワークネットワークの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2d00924d-1a6c-730d-19e4-c416dc80bc37.png)

# 実践
[VPC ネットワークを作成して管理する](https://cloud.google.com/vpc/docs/create-modify-vpc-networks?hl=ja)を元に試します。

## 事前準備
### 課金を有効にする
1. お支払い画面の右上で「有効化」をクリックします
1. 「フルアカウントを有効にする」がポップアップで表示されるので、「有効化」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/acabe0c1-d9d3-7c9d-8332-7a019d5fc7bc.png" width=500 />
1. フルアカウントが有効になりました。が表示されるので「続行」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5daac0e6-7924-72da-63ff-35d6b9031ed5.png" width=400 />
1. 予算アラートを作成するで金額を入力し、「作成」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6217deca-ed12-7bac-5913-31a3d93fdfa5.png" width=400 />
1. 作成されました
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8a068ca0-bb4b-93c5-05cf-595b47895069.png" width=400 />


## 自動モード VPC ネットワークを作成する
1. トップページで、VPCネットワークを選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/95dc56f0-f511-74c7-c23f-ab8173eee10d.png)
1. VPCネットワークを作成をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fd685ae1-645c-c710-7bf9-309c74e9f557.png" width=400 />

1. 下記を入力し、「作成」をクリックします
    - 名前：任意
    - サブネット：自動
    - 動的ルーティングモード：リージョン
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/14e01760-eb9d-113b-c8d1-c88e28d08be3.png" width=400 />

1. 作成されました
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ecd97c44-bb2a-05af-2db2-679514791168.png" width=400 />

# 考察
今回、GCPのVPCネットワークについて整理し、作成してみました。
AWSのネットワークと似ていますが、GCPの場合は、グローバルサービスという点が大きく違うところでしょうか。

# 参考
https://qiita.com/zumax/items/1c81590e09e01b690345

https://cloud.google.com/vpc/docs/vpc?hl=ja

https://www.usenix.org/system/files/conference/nsdi18/nsdi18-dalton.pdf

https://cloud.google.com/vpc/docs/subnets?hl=ja

https://cloud.google.com/compute/docs/instances?hl=ja

https://cloud.google.com/vpc/docs/create-modify-vpc-networks?hl=ja