LoginSignup
2
1

RailsのproductionモードでAWSのヘルスチェックがUnhealthyになる

Posted at

エラー内容

Railsで開発したAPIをproductionモードでEC2に配置し、ELBで冗長化して動作確認をしていたのですが、ヘルスチェックの結果がUnhealthyになってしまいます。
スクリーンショット 2023-06-24 165731.png

サーバーのログを確認すると、下記のログがたくさん吐かれていました。

... "GET / HTTP/1.1" 404 0 "-" "ELB-HealthChecker/2.0" "-"

原因

Railsはdevelopmentモードだとルートパスが定義されていなくてもウェルカムページが表示されますが、productionモードだと明示的にルートパスを指定しないと404エラーになります。

そして、ヘルスチェックの対象のパスがデフォルトの/のままだったので、ヘルスチェックに対して404エラーが返されてUnhealthyになってしまうといった具合のようです。
image.png

対策

ヘルスチェックのHTTPリクエストに対して、ステータスコード200(成功)を返すエンドポイントを定義しました。

ヘルスチェックの設定でカスタムパスを指定します。
image.png

routes.rbに上記のヘルスチェックに対応するルートを追加します。
/healthcheckへのGETリクエストに対して常にステータスコード200(成功)と空のヘッダー、空のボディを返します。

config/routes.rb
Rails.application.routes.draw do
  get '/healthcheck', to: proc { [200, {}, ['']] }
end

これでヘルスチェックに対してアプリケーションが稼働していることを示す応答を返せます。

... "GET /healthcheck HTTP/1.1" 200 5 "-" "ELB-HealthChecker/2.0" "-"

無事にHealthyになりました。
image.png

あとがき

今回の事象は運用上そのままでも問題ないかもしれませんが、実際にサーバーに異常があった際にエラーの切り分けをするためにもなるべくHealthyの状態にしておいた方がいいと思ったので対策しました。
他にいいアプローチがあればぜひご教授いただきたいです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1