オートスケールグループのヘルスチェックについて調べてみた

オートスケールグループのヘルスチェックについて調査してみたのでその時のメモ。(ELBのヘルスチェックではない)


## オートスケールのヘルスチェックについて

オートスケールのヘルスチェックを利用することで不正なインスタンスを自動でterminateすることができる機能です。

[ヘルスチェック（Auto Scaling インスタンス対象)](http://docs.aws.amazon.com/ja_jp/AutoScaling/latest/DeveloperGuide/healthcheck.html)

ELB ヘルスチェックのチェック間隔は ELB で設定します。
EC2 のヘルスチェック間隔は規定値に基づいて行われ、ユーザ側で変更する事はできません。

以下のいずれかの場合にオートスケールは対象のEC2インスタンスを不正なインスタンスとみなし、自動でterminateさせます。

+ インスタンスステータスがrunning以外の場合
+ システムステータスが impaired である場合
+ オートスケーリンググループのElastic Load Balancingの設定を行っており、ヘルスチェックタイプでELBを選び、インスタンスがELBのOutOfServiceとなった場合
+ AWS CLI を使用してインスタンスのヘルス状態を設定し、Unhealthyとして設定された場合

## インスタンスステータスがrunning以外の場合

オートスケールグループのEC2の状態をstopにするとオートスケーリングのヘルスチェック機能によってterminateさせられます。

ただし、2014年の機能追加でオートスケーリンググループからEC2を取り外すことが出来るようになったので、例えばメンテナンスで一時的にstopにした時にterminateさせられないようにすることが出来るようになりました。

[[新機能]Auto Scaling Groupからインスタンスを取り外せるようになりました！](http://dev.classmethod.jp/cloud/aws/newfeature-as-detach-instance/)

上記ではAuto Scaling Command Line Tool : Developer Tools : Amazon Web Servicesというツールを使っていましたが、現在はAWS CLIで出来るようです。


デタッチ（オートスケーリンググループから出る）

```
$aws autoscaling detach-instances
[--instance-ids <value>]
--auto-scaling-group-name <value>
--should-decrement-desired-capacity | --no-should-decrement-desired-capacity
```

アタッチ（オートスケーリンググループに入る）

```
$aws autoscaling attach-instances
[--instance-ids <value>]
--auto-scaling-group-name <value>
```

例えばオートスケーリンググループのDescire=2の状態で

```
$aws autoscaling detach-instances --instance-ids i-3c09d3ce --auto-scaling-group-name TestAutoScale --should-decrement-desired-capacity
```

とした場合、`should-decrement-desired-capacity
`オプションの指定により、1台のインスタンスがオートスケーリンググループから外れるとともにdesired=1になります。上記によって追加でインスタンスがオートスケールに入ることはありません。また、指定したインスタンスはrunningの状態のままオートスケーリンググループから外れます。

再度オートスケーリンググループに戻す場合には以下のコマンドを実行します。

```
$aws autoscaling attach-instances --instance-ids i-3c09d3ce --auto-scaling-group-name TestAutoScale
```

上記によって指定したインスタンスがオートスケールグループのインスタンスに戻りました。また、オートスケールグループのdesiredが2に戻りました。

以下のように`no-should-decrement-desired-capacity
`オプションを利用してデタッチした場合、

```
$aws autoscaling detach-instances --instance-ids i-3c09d3ce --auto-scaling-group-name TestAutoScale --no-should-decrement-desired-capacity
```

desire=2のままとなるのでオートスケールに1台インスタンスが追加されます。

## システムステータスが impaired である場合

[インスタンスのステータスチェック](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)

大きく分けて以下2パターンで確認しているようです。

1.システムステータスのチェック

+ ネットワーク接続の喪失
+ システム電源の喪失
+ 物理ホストのソフトウェアの問題
+ 物理ホストのハードウェアの問題

こちらはAWS内部の障害のようなイメージかと思います。

2.インスタンスステータスのチェック

+ 失敗したシステムステータスチェック
+ 正しくないネットワークまたは起動設定
+ メモリの枯渇
+ 破損したファイルシステム
+ 互換性のないカーネル

こちらはインスタンス内の障害でユーザーの操作によっては発生する可能性があると思います。

## オートスケーリンググループのElastic Load Balancingの設定を行っており、ヘルスチェックタイプでELBを選び、インスタンスがELBのOutOfServiceとなった場合

[Auto Scaling グループに Elastic Load Balancing ヘルスチェックを追加する](https://docs.aws.amazon.com/ja_jp/AutoScaling/latest/DeveloperGuide/as-add-elb-healthcheck.html)

オートスケーリンググループのElastic Load Balancingの設定を行っており、ヘルスチェックタイプでELBを選び、インスタンスがELBのヘルスチェックでOutOfServiceとなった場合、対象のインスタンスをterminateします。

オートスケーリンググループでELBを指定せず、オートスケーリンググループのEC2を手動でELBにひも付けた場合も同様に、ELBのヘルスチェックによってOut of serviceとなってELBから外れ、オートスケーリングの機能により インスタンスは terminateはされます。

オートスケーリンググループでELBを指定している場合でもヘルスチェックタイプでEC2を指定した場合、ELBのヘルスチェクでOutOfServiceになってもインスンスはterminateされません。


## AWS CLI を使用してインスタンスのヘルス状態を設定し、Unhealthyとして設定された場合

こちらは利用者がみずから「このインスタンスは不正な状態である」とオートスケールに通知することが出来るものです。例えばオートスケーリンググループを定期的に監視し、いずれかの条件に合致した対象のインスタンスを停止する場合などに使えるのかと思います。

具体的には以下のコマンドで設定が可能です。

```
$aws autoscaling set-instance-health --instance-id i-123abc45d –-health-status Unhealthy
```

オートスケーリンググループに設定したHealth Check Grace Period
のタイミングでインスタンスがterminateされます。desiredの値は減らないため、terminateのタイミングで新しいインスタンスがオートスケールグループ内で起動します。