GCP スキルバッジをもらおう ~6. VPC ネットワーク ピアリング〜Security & Identity Fundamentals

実際にラボを実施した際の記録を載せていきます。
学習の助けになったリンクや、後に見るための学習メモ、ちょっと迷った手順を書いていきます。
あと、コマンドも忘れたくないのでログしていきます。

* 学習の助けになったリンクは、「学習に役立つリンク」にまとめて書いてあります。
* 学習メモは:writing_hand:アイコンをつけてます。
* 迷った手順は箇条書きでつらつら書いてます。
実際の手順については、[Google Cloud Skills Boost](https://www.cloudskillsboost.google/)のラボの手順を参照してください。

クエスト「[Security & Identity Fundamentals](https://www.cloudskillsboost.google/quests/40)」の4つめのラボです。
SkillBoostの始め方は記事「[GCP スキルバッジをもらおう　1Google Cloud Skill Boostをはじめよう](https://qiita.com/orange-tora/items/57d5fe3486f4c7e1a58a)」をどうぞ。

:::note info
この記事は「<a href="https://qiita.com/advent-calendar/2021/gcp-skill-boost-sif">GCP スキルバッジをもらおう！　〜Security & Identity Fundamentals Advent Calendar 2021</a>」の一部として公開しています。
２５日にスキルバッジが獲得できるペースで公開していきます。
:::

##ラボの情報
ラボの名前：[VPC ネットワーク ピアリング](https://www.cloudskillsboost.google/focuses/964?parent=catalog)
所要時間：45分　レベル：Advanced　必要なクレジット:７
概要：
２つの異なるプロジェクトでそれぞれVPCネットワークを作成して、２つのVPCの間でピアリングを設定し、セッションを設定して接続テストを行う。
>たとえば、組織が project-A の network-A と project-B の network-B の間で VPC ネットワーク ピアリングを確立する必要があるとします。この場合は、network-A と network-B の管理者がそれぞれのネットワークでピアリングを設定する必要があります。
(ラボより抜粋:このラボで作成するNWの最終イメージ)
![スクリーンショット 2021-12-19 22.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365170/b67608e3-fbea-25b5-ff77-2ec42872adcc.png)

学習メモ:writing_hand:：VPCネットワークピアリングって？
**同じまたは異なる組織のGCPプロジェクト間で プライベート通信を構成する手段**
ここは共有VPCとの違いです。共有VPCは異なるGCPプロジェクト間でのみ有効です。
>VPC ネットワーク ピアリングは、次のような場合に役立ちます。
・組織に複数のネットワーク管理ドメインがある場合
・他の組織とピアリングを行う場合

**分散型のマルチプロジェクト ネットワーキング手法です**
個別の管理グループ下で制御でき 固有のグローバルファイアウォールと ルーティングテーブルを維持する。
ここが、共有VPCとの違いでもあります。共有VPCはファイアウォールルールとルーティングテーブルを１つのホストプロジェクトで管理する集中型の手法です。

**VMインスタンス同士が 内部IPアドレスでプライベートに通信できる**
外部IPアドレスやVPNの使用に伴う レイテンシ、セキュリティ、費用の 問題がありません
 
##学習に役立つリンク
参考URL：
[VPC ネットワークの概要](https://cloud.google.com/vpc/docs/vpc?hl=ja)
[VPC ネットワーク ピアリングの概要](https://cloud.google.com/vpc/docs/vpc-peering?hl=ja)
関連SDK：
https://cloud.google.com/sdk/gcloud/reference/compute/networks
https://cloud.google.com/sdk/gcloud/reference/compute/instances
https://cloud.google.com/sdk/gcloud/reference/compute/firewall-rules

##ラボの実施記録
このラボはプロジェクトを２つ使う。
ラボの起動画面の情報をチェックしておく。
Project 1を「Project-A」、Project ２を「Project-B」として操作していいきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365170/07d415ed-e427-cf8b-a80a-58a7742a37b2.png" width="300" Height="500">
￼
最初は「Project A」がCloudConsoleに表示されている状態のはず。
CloudShellを起動し、```＋```を押して、２つ目のCloudShellを起動して、「Project-B」に接続するようにしておく。

```
$gcloud config set project <PROJECT_ID2>
```

###VPC ネットワーク ピアリングを設定する
####プロジェクトでカスタム ネットワークを作成する
１つめのCloudShellで、「Project-A」にカスタムネットワークを作成します。

```
gcloud compute networks create network-a --subnet-mode custom
```
```
Created [https://www.googleapis.com/compute/v1/projects/[Project-AのID]/global/networks/network-a].
NAME: network-a
SUBNET_MODE: CUSTOM
BGP_ROUTING_MODE: REGIONAL
IPV4_RANGE:
GATEWAY_IPV4:

Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:
$
```

VPC内にサブネットを作成して、リージョンとIPレンジを指定する。

```
$ gcloud compute networks subnets create network-a-central --network network-a \
>     --range 10.0.0.0/16 --region us-central1
```
```
Created [https://www.googleapis.com/compute/v1/projects/[Project-AのID]/regions/us-central1/subnetworks/network-a-central].
NAME: network-a-central
REGION: us-central1
NETWORK: network-a
RANGE: 10.0.0.0/16
STACK_TYPE: IPV4_ONLY
IPV6_ACCESS_TYPE:
IPV6_CIDR_RANGE:
EXTERNAL_IPV6_CIDR_RANGE:
$
```

VMインスタンスを作成する

```
$ gcloud compute instances create vm-a --zone us-central1-a --network network-a --subnet network-a-central
```
```
Created [https://www.googleapis.com/compute/v1/projects/[Project-AのID]/zones/us-central1-a/instances/vm-a].
NAME: vm-a
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.0.0.2
EXTERNAL_IP: 35.223.175.40
STATUS: RUNNING
$
```

ファイアウォールルールを編集して、```icmp```と```tcp/22 ssh```を```allow```するようにする。
ラボの最後で疎通確認のためにsshとPingを使うからです。

```
$ gcloud compute firewall-rules create network-a-fw --network network-a --allow tcp:22,icmp
```
```
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/[Project-AのID]/global/firewalls/network-a-fw].
Creating firewall...done.
NAME: network-a-fw
NETWORK: network-a
DIRECTION: INGRESS
PRIORITY: 1000
ALLOW: tcp:22,icmp
DENY:
DISABLED: False
```

２つめのCloudShellで、「Project-B」にカスタムネットワークを作成します。
こちらは割愛します。

###VPC ネットワーク ピアリング セッションを設定する
ここはCloudConsoleで操作します。
まずは、「Project-A」のコンソールで```network-a```から「Project-B」の```networc-b```へのピアリングを作成します。
次に逆方向、「Project-B」のコンソールで```networc-b```から「Project-A」の```network-a```へのピアリングを作成します。

:writing_hand:ピアリングの作成操作

1. ハンバーガー＞VPC　Network>VPC network peering>に移動
1. 右側パンで「CREATE PEERING CONNECTION」をクリック
1. そのまま、「Continue」を押す
1. [Name]を入力する「peer-ab」
1. [Your VPC network] でピアリング元のNWを選択する。「network-a」
1. [Peerd VPC Network] で [別のプロジェクト] を選択
1. [Project ID] は、2 番目のプロジェクトの ID で置き換え
1. [VPC Network name] には「network-b」を入力
1. [Create]をクリック

設定後の表示例。
この状態では１方向しかセッションを作っていないので、StatusがInactive
![VPC network peering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365170/adbfe732-ed06-9370-2fb4-aa0d463316aa.png)
￼
もう一つブラウザタブを開いてコンソールを表示して、プロジェクトを「Project-B」に切り替えて、逆方向のピアリングを作成します。
設定値：
　[Name]：peer-ab
　[Your VPC network] ：network-b
　[Peerd VPC Network] :[別のプロジェクト] を選択
　[Project ID] :2 番目のプロジェクトの ID で置き換え
　[VPC Network name]:network-b

結果表示の例。今度は、双方向でセッションを作ったので、StatusがActiveになった。

![VPC network peering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365170/72a93119-1dd0-07f3-62df-daccc6686bf5.png)
￼
CloudShellで確認のため、「project-A」のすべての VPC ネットワークのルートを一覧表示する。

```
$ gcloud compute routes list --project　[Project-AのID]
```
```
…
NAME: default-route-730b4154fcca58f5
NETWORK: network-a
DEST_RANGE: 0.0.0.0/0
NEXT_HOP: default-internet-gateway
PRIORITY: 1000
…
NAME: peering-route-1ff76c14819d0fd6
NETWORK: network-a
DEST_RANGE: 10.8.0.0/16
NEXT_HOP: peer-ab
PRIORITY: 0
```

###接続テスト
（Project-A）のタブで実施
ハンバーガー＞Compute Engine＞VM Instanceを表示する。
VMのリストが表示されているので、「vm-a」のInternal-IPをコピーする。

（Project-B）のタブで実施
ハンバーガー＞Compute Engine＞VM Instanceを表示する。
VMのリストが表示されているので、「vm-b」のSSHボタンを押して接続する。
そこで、コピーしておいた「Project-A」の「vm-a」のInternal-IPにPingする。
うまくいけば、成功です。

##お疲れさまでした
これでラボの手順は終了。
右上のスコア表示が「100/100」になっていることを確認して、「ラボを終了」を押します。