CFアプリ開発と管理#8 アプリ・ヘルスチェックの使用

このトピックでは、Cloud Foundryでアプリケーションのヘルスチェックを構成する方法について説明します。

*注意事項: この記事は、Cloud Foundry Documentaion [Using Application Health Checks](https://docs.cloudfoundry.org/devguide/deploy-apps/healthchecks.html) (last updated: February 14, 2017)からの独自の翻訳とコメントです。内容を保証するものではありません。*


## 概要
アプリケーション・ヘルスチェックは、実行中のCloud Foundryアプリのステータスを継続的にチェックする監視プロセスです。

開発者は、Cloud Foundryコマンドライン・インターフェイス（CLI）を使用するか、アプリケーション・マニフェストの *health-check-http-endpoint* および *health-check-type* フィールドを指定することによって、アプリケーションのヘルスチェックを設定できます。

cf CLIを使用してヘルスチェックを設定するには、以下の「ヘルスチェックの設定」セクションの指示に従ってください。 アプリケーションマニフェストを使用してヘルスチェックを構成する方法の詳細については、「[アプリ・マニフェストによるデプロイ](http://qiita.com/MahoTakara/items/888ffdadbf34fd2033d6#cf-push-%E3%81%8C%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%8E%A2%E3%81%99%E6%96%B9%E6%B3%95)」の「[health-check-http-endpoint](https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html#health-check-http-endpoint)」および「[health-check-type](https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html#health-check-type)」のセクションを参照してください。

アプリケーションヘルスチェックは、[Diegoアーキテクチャ](https://docs.cloudfoundry.org/concepts/diego/diego-architecture.html)によって管理されるアプリライフサイクルの一環として機能します。


## ヘルスチェックの設定

アプリケーションの作成または更新中にヘルスチェックを設定するには、cf pushコマンドを使用します。

~~~
$ cf push YOUR-APP -u HEALTH-CHECK-TYPE -t HEALTH-CHECK-TIMEOUT
~~~

上記の例のコマンドでプレースホルダを次のように置き換えます。

* HEALTH-CHECK-TYPE： 有効なヘルスチェックタイプは、ポート、プロセス、およびhttpです。詳細については、本書のヘルスチェックタイプのセクションを参照してください。

* HEALTH-CHECK-TIMEOUT：タイムアウトは、アプリケーションの起動から最初の正常な応答までの経過時間です。詳細については、本書のヘルスチェックタイムアウトのセクションを参照してください。

注意：cf pushで指定したヘルスチェック設定は、アプリケーション・マニフェストの設定を上書きします。

既存のアプリケーションのヘルスチェックを設定するか、カスタムHTTPエンドポイントを追加するには、[cf set-health-check](http://cli.cloudfoundry.org/ja-JP/cf/set-health-check.html)コマンドを使用します。

~~~
$ cf set-health-checkあなたのアプリのHEALTH-CHECK-TYPE --endpoint CUSTOM-HTTP-ENDPOINT
~~~

上記の例のコマンドでプレースホルダを次のように置き換えます。

* HEALTH-CHECK-TYPE: 有効なヘルスチェックタイプは、ポート、プロセス、およびhttpです。詳細については、[ヘルスチェックタイプ]()のセクションを参照してください。
* CUSTOM-HTTP-ENDPOINT: httpヘルスチェックでは、デフォルトでエンドポイントとして/が使用されますが、カスタムエンドポイントを指定できます。詳細については、以下の「[ヘルスチェックHTTPエンドポイント]()」のセクションを参照してください。

注意：'cf set-health-check' を使用してデプロイされたアプリケーションのヘルスチェック設定を変更できますが、変更を有効にするにはアプリを再起動する必要があります。

## ヘルスチェックの理解

### ヘルスチェック・ライフサイクル

次のテーブルは、Cloud Foundry のヘルスチェックの動作について記述したものです。

|Stage|　説明|
|:-----:|:--  |
|1      |アプリケーション開発者はCloud Foundryにアプリをデプロイします。|
|2      |アプリをデプロイするとき、デベロッパーはアプリのヘルスチェックタイプと、オプションでタイムアウトを指定します。 開発者がヘルスチェックタイプを指定しない場合、監視プロセスのデフォルトはポートヘルスチェックになります。|
|3      |Cloud Controllerは、アプリケーションをステージング、起動、実行します。|
|4      |アプリに指定されたタイプに基づいて、Cloud Controllerは各アプリケーション・インスタンスに対して定期的に実行されるヘルスチェックを設定します。|
|5      |Diegoがアプリケーション・インスタンスを起動すると、アプリケーション・インスタンスが正常であることを応答するまで、またはヘルスチェック・タイムアウトが経過するまで、アプリケーションのヘルスチェックが2秒ごとに実行されます。 2秒のヘルスチェック間隔は設定できません。|
|6      |アプリ・インスタンスが正常になると、そのルートが広告されます（該当する場合）。 その後の健康診断は、アプリが正常になったら30秒ごとに実行されます。 30秒のヘルスチェック間隔は設定できません。|
|7      |以前に正常なアプリケーションインスタンスがヘルスチェックに失敗した場合、Diegoはその特定のインスタンスが不健全であるとみなします。 その結果、Diegoはappインスタンスを停止して削除し、新しいappインスタンスを再スケジュールします。 このアプリケーションインスタンスの停止と削除は、クラッシュイベントとしてクラウドコントローラに報告されます。|
|8      |アプリインスタンスがクラッシュすると、Diegoは直ちにアプリインスタンスを何度か再起動しようとします。 再起動が3回失敗すると、Cloud Foundryは30秒間待機してから再起動を試みます。 待機時間は、9回目の再起動まで再起動ごとに2倍になり、200回目の再起動までその期間にとどまります。 200回の再起動後、Cloud Foundryはアプリケーションインスタンスの再起動を中止します。|

### ヘルスチェック・タイプ

次の表は、アプリケーションで使用可能なヘルスチェックの種類と、それらを使用する推奨される状況を示しています。

|Health Check Type | 推奨するユースケース | 解説 |
|:--:              |:--               |:--  |
| http             | アプリは HTTP200を応答できる |httpヘルスチェックは、設定されたHTTPエンドポイントに対してGET要求を実行します。 ヘルスチェックがHTTP 200応答を受け取ると、そのアプリは正常に宣言されます。 可能であれば、httpヘルスチェックの種類を使用することをお勧めします。 健全なHTTPレスポンスにより、WebアプリケーションはHTTPリクエストを処理できる状態になります。 設定されたエンドポイントは、1秒以内に応答して正常とみなされる必要があります。|
| port             |アプリケーションはTCP接続（HTTP Webアプリケーションを含む）を受け取ることができます。| ヘルスチェックは、アプリケーション用に設定されたポートまたは複数のポートへのTCP接続を行います。 複数のポートを持つアプリケーションの場合、ヘルスチェックは各ポートを監視します。 アプリケーションのヘルスチェックタイプを指定しない場合、監視プロセスのデフォルトはポートヘルスチェックになります。 TCP接続は1秒以内に確立され、正常とみなされなければなりません。|
| process          |アプリケーションはTCP接続（ワーカーなど）をサポートしていません。|プロセスヘルスチェックの場合、Diegoは、アプリケーション用に宣言されたプロセスが実行中であることを保証します。 プロセスが終了すると、Diegoはアプリケーション・インスタンスを停止して削除します。|


### ヘルスチェック・タイムアウト

ヘルスチェックタイムアウトに設定された値は、アプリの起動時からアプリケーションからの最初の正常な応答までの経過時間です。 ヘルスチェックが設定されたタイムアウト時間内に健全な応答を受信しない場合、アプリケーションは問題があると宣言されます。

Cloud Foundryでは、デフォルトのタイムアウトは60秒で、設定可能なタイムアウトの最大値は180秒です。

### ヘルスチェックHTTPエンドポイント
HTTPタイプでは、cf set-health-checkコマンドの--endpointは、アプリケーションによって提供されなければならないURIのパス部分を指定し、アプリケーションが正常なときにHTTP 200の応答を期待します。