エラー内容
Railsで開発したAPIをproductionモードでEC2に配置し、ELBで冗長化して動作確認をしていたのですが、ヘルスチェックの結果がUnhealthyになってしまいます。
サーバーのログを確認すると、下記のログがたくさん吐かれていました。
... "GET / HTTP/1.1" 404 0 "-" "ELB-HealthChecker/2.0" "-"
原因
Railsはdevelopmentモードだとルートパスが定義されていなくてもウェルカムページが表示されますが、productionモードだと明示的にルートパスを指定しないと404エラーになります。
そして、ヘルスチェックの対象のパスがデフォルトの/
のままだったので、ヘルスチェックに対して404エラーが返されてUnhealthyになってしまうといった具合のようです。
対策
ヘルスチェックのHTTPリクエストに対して、ステータスコード200(成功)を返すエンドポイントを定義しました。
routes.rb
に上記のヘルスチェックに対応するルートを追加します。
/healthcheck
へのGETリクエストに対して常にステータスコード200(成功)と空のヘッダー、空のボディを返します。
Rails.application.routes.draw do
get '/healthcheck', to: proc { [200, {}, ['']] }
end
これでヘルスチェックに対してアプリケーションが稼働していることを示す応答を返せます。
... "GET /healthcheck HTTP/1.1" 200 5 "-" "ELB-HealthChecker/2.0" "-"
あとがき
今回の事象は運用上そのままでも問題ないかもしれませんが、実際にサーバーに異常があった際にエラーの切り分けをするためにもなるべくHealthyの状態にしておいた方がいいと思ったので対策しました。
他にいいアプローチがあればぜひご教授いただきたいです。