GCEのオートヒーリングを試す

# AutoHealing
## 概要
GCEの`managed instance-group`には[autohealing](https://cloud.google.com/compute/docs/instance-groups/creating-groups-of-managed-instances#monitoring_groups)という機能がある。
文字通り、ヘルスチェックの結果によってインスタンスを自動修復(再作成)する機能だ。

負荷分散におけるヘルスチェックは、ロードバランサの振り先が`HEALTHY`かどうかを見るだけで、インスタンスの再作成は行わないが、マネージドインスタンスグループに適用されるヘルスチェックはインスタンスが`UNHEALTHY`になったら、削除して再作成する。

ヘルスチェックはHTTP、HTTPS、TCP、SSL(TLS)プロトコルをサポートする。

> **注意**
> 2018/07/11時点では Betaの機能
>
> * ヘルスチェックの結果、マネージド インスタンス グループによってインスタンスが削除され再作成される場合、VM インスタンスに関連付けられているインスタンス テンプレートによって新しいインスタンスのプロパティが決まります（マネージド インスタンス グループに関連付けられているデフォルトのインスタンス テンプレートであるとは限りません）。 たとえば、instance-template-a を使用して VM インスタンスが作成された後、instance-template-b を使用するようにユーザーがマネージド インスタンス グループを更新したとします。この場合、ヘルスチェックによりその VM インスタンスが再作成されるときには、Compute Engine は引き続き instance-template-a を使用します。これは、ヘルスチェックによるインスタンスの再作成はユーザーではなく Compute Engine によって行われ、Compute Engine には VM インスタンスが新しいテンプレートを使用するべきだという前提がないためです。
> * 既存のインスタンスのディスクにデータを書き込んだ場合、インスタンスが削除されて再作成される際にそのデータは失われます。これを回避するには、定期的に永続ディスクのスナップショットを作成したり、Google Cloud Storage などの別のソースにデータをエクスポートしたりするなどの対策を講じます。このため、必要なカスタム設定を含む[カスタム イメージ](https://cloud.google.com/compute/docs/instance-templates#using_custom_or_public_images_in_your_instance_templates)をインスタンス テンプレートで指定しておくこともおすすめしています。そうすれば、インスタンスが再作成される際にマネージド インスタンス グループはそのカスタム イメージを使用します。

## やってみる
今回はCentOSにNginxをインストールしたカスタムイメージを作成して、そのNginxを落とした際にイメージが再作成されるかというのを試す。
また、そのときに事前に取得した固定GIPで起動できるようにする。

### カスタムイメージの作成

```
gcloud beta compute --project=my-project instances create \
source-custom-image --zone=asia-northeast1-a --machine-type=n1-standard-1 \
--network=default --network-tier=PREMIUM --maintenance-policy=MIGRATE \
--service-account=XXXXXXXXXX-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \
--image=centos-7-v20180611 --image-project=centos-cloud --boot-disk-size=10GB \
--boot-disk-type=pd-standard --boot-disk-device-name=source-custom-image
```

nginxのインストール

```shell
$ sudo yum install -y nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
# ブラウザから起動確認もしておく。

$ sudo shutdown now
```

custom-imageの作成

```
gcloud compute --project=my-project images create source-custom-image \
--source-disk=source-custom-image --source-disk-zone=asia-northeast1-a
```

### 静的GIPの取得

```
gcloud beta compute --project=my-project addresses create nginx-01 \
--region=asia-northeast1 --network-tier=PREMIUM

```

### インスタンステンプレートの作成

```
gcloud beta compute --project=my-project instance-templates create \
nginx-instance-template-1 --machine-type=n1-standard-1 --network=projects/my-project/global/networks/default \
--network-tier=PREMIUM --maintenance-policy=MIGRATE --service-account=XXXXXX-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \
--image=source-custom-image --image-project=my-project --boot-disk-size=10GB \
--boot-disk-type=pd-standard --boot-disk-device-name=nginx-instance-template-1 \
--address ${先程取得したIP(nginx-01)を設定}
```

### ヘルスチェックの作成
ヘルスチェックは、以下とする。

* 5秒間隔でチェック
* 5秒でタイムアウト
* 異常しきい値3回でNG
* 正常しきい値1回でOK

```
gcloud compute --project "my-project" health-checks create http nginx-healthcheck --check-interval 5 \
    --healthy-threshold 1 --unhealthy-threshold 3 --request-path /

NAME               PROTOCOL
nginx-healthcheck  HTTP
```

### インスタンスグループの作成

インスタンスグループを作成する

```
gcloud compute --project "my-project" instance-groups managed create \
"nginx-instance-group-1" --zone "asia-northeast1-a" --base-instance-name \
"nginx-instance-group-1" --template "nginx-instance-template-1" --size "1"
```

インスタンスグループにAutoHealingを設定する

```
gcloud beta compute --project "my-project" instance-groups managed set-autohealing nginx-instance-group-1 \
--health-check nginx-healthcheck --initial-delay 120 --zone asia-northeast1-a
```

## 実験

Jmeterを使用してGIPに対して毎秒リクエストを送りながらダウンタイムを計測する。

### 今のインスタンス確認
もちろん**RUNNING**

```
$ gcloud compute instances list | grep nginx-instance-group
nginx-instance-group-1-8qt2                 asia-northeast1-a  n1-standard-1                           10.240.0.31     35.200.28.55     RUNNING
```

### nginxを落とす

```
$ sudo systemctl stop nginx
```


### 今のインスタンス確認
**STOPPING**になってる

```
$ gcloud compute instances list | grep nginx-instance-group
nginx-instance-group-1-8qt2                 asia-northeast1-a  n1-standard-1                           10.240.0.31     35.200.28.55     STOPPING
```

### 自動修復後のインスタンス確認
インスタンス名に変更は無く、RUNNINGになっている。また、GIPももちろん変更なし。

```
$ gcloud compute instances list | grep nginx-instance-group
nginx-instance-group-1-8qt2                 asia-northeast1-a  n1-standard-1                           10.240.0.31     35.200.28.55     RUNNING
```

### ダウンタイム

00:02:01で2分くらいのダウンタイムとなっていた。