ALBのヘルスチェックでHealth checks failed with these codes [302]が出た場合の改善方法はどうすればいいですか?

2021.06.24

困っていた内容

ALBのターゲットグループのヘルスチェックで Health checks failed with these codes [302] の状態になり、ヘルスステータスが「healthy」になりません。どのように改善すれば良いでしょうか?

ヘルスステータス_unhealthy

どうしてこうなった?

ヘルスチェックの設定でデフォルトではヘルスチェックパスが「/」に設定されています。

ここでリクエストがリダイレクトされていた場合は、ステータスコードとして「301」や「302」等、「3xx」のステータスコードが返されます。

デフォルトでは成功コードは「200」となっているため、ヘルスステータスは「unhealthy」となってしまいます。

ヘルスチェックの設定確認

例として、http://example.com/にアクセスした際に、http://example.com/top_page.htmlにリダイレクトするWebサイトを構築していたとします。

この場合、ヘルスチェックのパスとして「/」を設定していた場合、

http://example.com/ にヘルスチェックのリクエストを送りますが、ここではリダイレクトが設定されているため、「3xx」のステータスコードが返されます。

これが

こうなる

curlコマンドでもステータスコードを確認してみます。

「302」が返ってきていますね。これがヘルスステータス「unhealthy」の原因となります。

どうすればいいの?

適切なヘルスチェックパスの設定

改善策としては、適切な実在するパスを設定する必要があります。

以下、順を追って説明します。

1.適切なパスの確認

先ほどの、リダイレクト先のページに対してのステータスコードを確認してみます。

「200」が返ってきました。このパスを指定してやれば良さそうです。

2.ヘルスチェックの設定を変更する

ターゲットグループの「ヘルスチェック」タブで「編集」をクリックします

「ヘルスチェックパス」が「/」になっているので、リダイレクトされないパス(今回の場合は「/top_page.html」)を指定します。

3.ヘルスステータスを確認

この状態でヘルスチェックが実施されると、「200」のステータスコードが返るため、ヘルスステータスは「healthy」となります。

ヘルスステータス_healthy

最後に

今回はリダイレクト先のパスを指定する例で説明しましたが、ヘルスチェック用のリダイレクトされない静的ページを用意し、そのページをヘルスチェックパスに設定するのもOKです。

また、成功コードに「301」、「302」等を設定することでもヘルスステータスは「healthy」となりますが、

リダイレクト先でトラブルが生じた場合に別のステータスコードを返す仕組みを用意していない場合、ヘルスチェックに異常は無いのに、503エラーになる。等のトラブルに繋がりかねません。

これは、ヘルスチェックとしては適切では無いので注意しましょう。

参考資料

ターゲットグループのヘルスチェック - Elastic Load Balancing