ヘルスチェックのエンドポイントを分ける
課題
ヘルスチェックによって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)