はじめに
AWSのALBでヘルスチェックが通らない問題に直面しました。
エラー画面は下記の通り。
ヘルスチェックの対象となるエンドポイントが HTTP 301 リダイレクト を返していることを示しています。
詰まっていた原因
HTTP接続でヘルスチェックを行おうとしているのにrails側ですべてのリクエストを HTTPS に強制的にリダイレクトさせる設定になっていたことが原因でしした。
そのため、HTTP でのリクエストが送られてきた場合、自動的に HTTPS にリダイレクトする機能をOFFにしました。
具体的には下記の通り。
config.force_ssl = false
他にやったこと
VPC 設定で DNS 解決 と DNS ホスト名 が有効になっていること
まず、VPCを作成すると、デフォルトではDNS 解決のみ『有効』になっており、DNS ホスト名は『無効』になっています。
ですので、DNS ホスト名を有効にする必要があります。
ちなみに、DNS ホスト名を有効にすることでEC2 インスタンスにホスト名 (DNS 名(例: ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com))が割り当てられます。
名前解決を行ってくれるので、名前(DNS名)でインターネットからアクセス可能になったりSSH接続やHTTPリクエストに便利になります。
エンドポイントの設定
Rails.application.routes.draw do
get "up" => "rails/health#show", as: :rails_health_check
#以下ルーティング省略
end
rails が用意しているhealthを使いました。
自分で、パス "/up" へHTTPでアクセスした時に、常にステータスコード 200 が返却されるようにエンドポイントを作成してもいいと思います。
また、下記のようにヘルスチェックのパスのルーティングを/upに設定します。
終わりに
ALB のヘルスチェックが通らない原因の一つとして、HTTP から HTTPS へのリダイレクトが挙げられます。しかし、config.force_ssl = false を設定すると、HTTPS へのリダイレクトが無効になるため、セキュリティの観点から、本番環境では ALB 側で HTTPS を処理するように設定し、アプリケーション側では適切なリダイレクトポリシーを設定することを推奨します。
プログラミング学習中の初学者です。
内容の誤りや他に良い方法があれば、コメント等で教えていただけると幸いです。
参考記事
ALB のヘルスチェックが “Health checks failed with these codes:[XXX]” で失敗する原因と対処法を教えてください
VPC 「DNSホスト名」の有効化とは