GCLB(Google Cloud Load Balancing)の設定について簡単にまとめる-HTTP(S)版-

## GCLB(Google Cloud Load Balancing)とは
- とても簡単に言うとGoogleが提供する高性能の負荷分散サービス。
- HTTP(S)とTCPとUDPとプロトコルの違う負荷分散を提供している。

## HTTP(S)負荷分散とは
- HTTP および HTTPS アプリケーション用のレイヤ7負荷分散。
- webアプリケーションのフロント側の負荷分散なら主にHTTP(S)の負荷分散を設定することになる。(ブラウザからのアクセスを受ける側)

## 前提条件
- この記事で取り扱うのはHTTP(S）の負荷分散について。
- 負荷分散の対象サービスはGCEインスタンスグループ。
- HTTP(S)ロードバランサ配下にGCEで設定したVMインスタンスがある。

### ロードバランサを設定するが、オフィスまたは自宅のIPからはVMインスタンスに直接アクセスできるようにする。
- 実際のビジネス要件ではこのように設定することが多いと思われる。
- この設定をしなくてもロードバランサの設定はできる。

#### 設定方法
- VPCネットワーク/ファイアウォール ルールで設定する。
- 許可するIPの範囲で下記を設定する。
  - 35.191.0.0/16
  - 130.211.0.0/22
  - 自宅orオフィスのIP/範囲
- 上記の上2つがヘルスチェックの送信元IPになる。
- [ヘルスチェックファイアウォール規則](https://cloud.google.com/load-balancing/docs/health-checks?hl=ja#firewall_rules)
- 作成したファイアウォールルールを対象のVMインスタンスまたはインスタンステンプレートに適用する。
- 上記の設定の場合、VMインスタンスまたはインスタンステンプレートのファイアウォールのHTTP(S)通信を許可しないに設定し、外部IPは作成する。(ロードバランサからの内部IPへのHTTP通信と自宅orオフィスからの外部IPへの通信のみ許可)

## 負荷分散の設定について
- 設定するのは3つの項目
  - 1.バックエンド
  - 2.ホストとパスのルール
  - 3.フロントエンド

### 1.バックエンド
- 負荷分散の対象となるサービス。複数登録することができる。
- GCEインスタンスグループ or GCSバケット(この記事ではGCEインスタンスグループについて) を指定する。
- バックエンドの設定の前にGCEインスタンスグループやGCSバケットを作成しておく必要がある。
- [GCEインスタンスグループ](https://cloud.google.com/compute/docs/instance-groups/?hl=ja&_ga=2.154892337.-849991088.1563379533)とはGCEのインスタンスをグループ化して扱いやすくしたもの。
- HTTP(S)ロードバランサーの場合外部IPは必要ない。フロントエンドとバックエンドは内部IPで通信する。

#### バックエンドの設定について
- バックエンドの設定ではロードバランサとバックエンドサービス(負荷分散対象のサービス）の通信について設定する。主な設定項目は下記。
- ロードバランサがバックエンドとの通信で使うプロトコルとポート
  - HTTPS通信するなら対象のVMインスタンスにSSLの設定が必要。
- タイムアウト時間(バックエンドサービスの応答を待機する時間)
- 負荷分散の条件設定
  - 最大CPU使用率(バックエンドインスタンスグループ内のすべてのインスタンスにおけるCPU使用率の平均値でdefaultは80%)
  - 容量(CPU使用率を決めるための項目)
  - 負荷分散で新しいインスタンスを最大CPU使用率80%で動作させる場合は、分散モードの最大CPU使用率を80%、容量を100%に設定、インスタンスの使用率を半分に減らすには、分散モードの最大CPU使用率を80%、容量を50% に設定する。つまりVMインスタンスのCPU使用率そのままの値で条件分岐するなら、容量は100%にする。容量を減らしていくとその分実際のVMインスタンス自体のCPU使用率を下げて最大CPU使用率(バックエンドインスタンスグループ内のすべてのインスタンスにおけるCPU使用率の平均値)を考える。
  - [GCLBインスタンスグループ](https://cloud.google.com/load-balancing/docs/backend-service?hl=ja&_ga=2.255032449.-849991088.1563379533#instance_groups)
- CloudCDNを有効にするかどうか
- ヘルスチェック(対象のインスタンスにアクセスできるかどうかリクエストを送る)を行うかどうか
  - ヘルスチェックを行う場合
  - 通信のプロトコルやポート
  - チェックの間隔と正常か異常かの条件を設定する。

### 2.ホストとパスのルール
- ロードバランサの転送ルールを設定できる。
- 対象のホストとパスを設定して転送先のバックエンドサービスを指定する。
- どのルールにも一致しないトラフィックは全て、最初の行で選択されたデフォルトのサービスに送信される。

### 3.フロントエンド
- クライアントがアクセスするIPアドレスやポート、プロトコルを設定する。
- プロトコルでHTTPSを選択した場合、SSL証明書の設定が必要になる。
  - 既に他のサービスを利用してSSL証明書があるならその証明書をアップロードすることも可能。もしくはドメインを指定してGoogle管理の証明書を作成することもできる。
- IPアドレスはエフェメラルか静的なIPを設定することができる。

## その他関連した設定について
### Cloud DNS に紐付ける
- ロードバランサのフロントエンドの設定で作成されたIPアドレスを、CloudDNSで作成したゾーンのレコードに設定すると紐づけることができる。
- [Google Cloud DNSでIPアドレスとドメイン名を紐付ける](https://qiita.com/NagaokaKenichi/items/95052742d40392f3215e)

以上になります。

#### 参考
- [ヘルスチェックファイアウォール規則](https://cloud.google.com/load-balancing/docs/health-checks?hl=ja#firewall_rules)
- [GCEインスタンスグループ](https://cloud.google.com/compute/docs/instance-groups/?hl=ja&_ga=2.154892337.-849991088.1563379533)
- [GCLBインスタンスグループ](https://cloud.google.com/load-balancing/docs/backend-service?hl=ja&_ga=2.255032449.-849991088.1563379533#instance_groups)
- [Google Cloud DNSでIPアドレスとドメイン名を紐付ける](https://qiita.com/NagaokaKenichi/items/95052742d40392f3215e)