ALB のヘルスチェックが “Health checks failed with these codes:[XXX]” で失敗する原因と対処法を教えてください

ALB のヘルスチェックが失敗するときは、まずここを確認しましょう。
2022.06.01

困っていた内容

ALB(Application Load Balancer)を構築しましたが、ターゲットグループのヘルスチェックステータスが unhealthy となり、詳細に "Health checks failed with these codes:[XXX]" と表示されています。 これを解決するには、どの設定を確認すればよいでしょうか?

どう対応すればいいの?

上記のメッセージは ALB からターゲット EC2 ヘ送信されるヘルスチェックリクエストに対し、ターゲット EC2 側から [XXX] の部分に表示されたHTTPステータスコードが返されていることを示します。

ALB ヘルスチェックには「成功コード」が設定されており、これと異なるステータスコードが EC2 側から連続して返されるとヘルスチェック失敗となります。これを解決するには、指定した「成功コード」が返されるように EC2 内部の設定を見直す必要があります。

以下に例を示します。
現在の設定はヘルスチェックの詳細画面で確認できます。

上記設定の場合「ヘルスチェックに成功するには EC2 上のパス "/" (ドキュメントルート)へHTTPでアクセスした時に、常にステータスコード 200 が返却される必要がある」ということを意味しています。この条件を満たしていないとヘルスチェックエラーになります。

ターゲット EC2 内部の設定を確認し、エラーメッセージに表示されたステータスコード [XXX] の原因を解決して、200 が返るようにしましょう。
(一般的なHTTPステータスコードとその意味は、参考資料の「HTTP レスポンスステータスコード」参考にしてみてください)

一例:

  • [404] の場合:
    指定したヘルスチェックパスに、応答を返すWebページが存在していないことを示します。例えばヘルスチェックパスが「/」である場合は、EC2 インスタンス内のドキュメントルートに index.html 等のWebページが存在しているか確認しましょう。

  • [403] の場合:
    指定したヘルスチェックパスに、権限の問題でアクセスできないことを示します。EC2 内のWebページに何らかのアクセス制限を設けている場合は、制限にかからないヘルスチェック専用の静的ページ(healthcheck.html等)を設置し、ヘルスチェックパスをそちらへ変更することも検討しましょう。

  • [301]や[302] の場合:
    指定したヘルスチェックパスに、リダイレクトが設定されていることを示します。ヘルスチェックパスには常に200のステータスコードを返す静的ページを設定しましょう。

    ※ ヘルスチェックの成功コードは任意に指定できるため、例えばリダイレクトを許容したい場合は成功コードの範囲に 300 系を含めることで、301 や 302 のレスポンスでもヘルスチェック成功と見なす設定が可能です。
    ただしその場合、もしリダイレクト先のWebページで問題が発生していてもヘルスチェックには成功する、という分かりにくい状況になってしまうため、一般的には成功コードを 200 にすることが推奨されます。

上記を解決し、EC2 からステータスコード 200 が返るように修正すれば、ALB のヘルスチェックは healthy になるはずです。
この情報がお役に立てば幸いです。

参考資料

ターゲットグループのヘルスチェック - Elastic Load Balancing
HTTP レスポンスステータスコード - HTTP | MDN