ヘルスチェックのエンドポイントを分ける

課題

ヘルスチェックによってWebアプリケーションが依存するDBなどのサービスの健康状態もチェックすると、Webアプリケーションが正常であっても依存するサービスが異常である限りヘルスチェックが失敗することになり、サービス全体に影響が出てしまう。また、ECSでは、ヘルスチェックが失敗したコンテナは再起動することになるため、依存するサービスが失敗している限り、コンテナが何度も再起動してしまう。

一方で、Webアプリケーションが依存するサービスと正常に接続しているかどうかを確認するには、依存するサービスも合わせてヘルスチェックするしかない。外形監視サービスを使う場合、DBなど外部から直接アクセスできないサービスの状態を確認するにはWebアプリケーションを経由するしかない。

方針

ロードバランサー用のエンドポイントと外形監視用のエンドポイントを分ける。

ロードバランサー用のエンドポイントでは、Webアプリケーションの健康状態のみを返すようにする。外形監視用のエンドポイントは依存するサービスも合わせてシステム全体の健康状態を返すようにする。

実装

Railsアプリの場合、okcomputerというrubygemが使いやすい。

gem "okcomputer"

gemをインストールするだけでエンドポイントが2つ定義される。GET /okcomputerでRailsアプリの健康状態だけを返す。このエンドポイントをロードバランサー用のヘルスチェックに使う。

$ curl http://localhost:3000/okcomputer
default: PASSED Application is running (0s)

また、GET /okcomputer/allで依存するサービスの状態も含めて返す。カスタマイズすることで、Redisなど他のサービスもヘルスチェックできる。こちらのエンドポイントを外形監視用のヘルスチェックに使う。

$ curl http://localhost:3000/okcomputer/all
Default Collection
  database: PASSED Schema version: 20190101000000 (0s)
  default: PASSED Application is running (0s)