ALB のヘルスチェックが “Request timed out” で失敗する原因と対処法を教えてください

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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

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

どう対応すればいいの?

上記のメッセージは ALB からターゲット EC2 へ送信されるヘルスチェックのリクエストが、タイムアウトで失敗していることを示します。

原因はいくつか考えられますが、弊社へのお問い合わせで多く見られるケースとして、ALB と ターゲット EC2 に紐づいたセキュリティグループの設定が適切でない可能性があります。
以下の例をもとに確認してみましょう。

まずは ALB のターゲットグループの詳細画面で、ターゲット EC2 への接続プロトコルとポートを確認すると「HTTP:80」に設定されています。

つまり今回の場合、ALB と ターゲット EC2 間で疎通を確保するには、以下の条件を満たしている必要があります。

  • ALB 側のセキュリティグループ設定
    アウトバウンド(送信)で EC2 への HTTP:80 アクセスが許可されている
  • EC2 側のセキュリティグループ設定
    インバウンド(受信)で ALB からの HTTP:80 アクセスが許可されている

上記の条件を満たしているか、まずは ALB 側のセキュリティグループのアウトバウンドルールを確認してみましょう。

EC2 を含むすべての送信先(0.0.0.0/0)に対して HTTP:80 の通信が許可されているため、問題なさそうです。

続いて EC2 側のセキュリティグループのインバウンドルールを確認してみましょう。

HTTP:80 のアクセスを許可するルールが無く、特定IPアドレスからの SSH:22 のアクセスのみが許可されています。
どうやらこれが原因のようです。

ALB からのインバウンドアクセスを許可するには、以下のいずれかを含んだルールを追加しましょう。

  • ALB に紐づいたセキュリティグループからの HTTP:80 を許可するルール
  • ALB と EC2 インスタンスの両方に紐づいたサブネットの CIDR 範囲からの HTTP:80 を許可するルール

今回は前者のパターンで、ALB に紐づいたセキュリティグループからのアクセスを許可するルールを追加します。

ルールを追加してしばらく待つと、ヘルスチェックが healthy 状態になりました。

上記は一例ですが、ALB の初期設定でつまづく要因としてセキュリティグループの設定が関連している事例は多く見られるので、まずはこの点に問題がないか確認しましょう。

もし上記を確認しても unhealthy になる場合は他の要因(EC2 内部の問題)も考えられるため、下記のブログも参考にしてみてください。

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

この情報がどなたかのお役に立てれば幸いです!

参考資料

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