ALBはヘルスチェックに指定したパスが存在しないと、ヘルスチェックに失敗する

2022.09.15

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

ALBのヘルスチェックに関連して、気付きづらいポイントがあるので解説します。

ALBのヘルスチェックについて

ALBはターゲットのステータスを確認するために定期的にリクエストを送信します。AWSコンソールから特になにも設定変更せずにターゲットグループを設定すると、"/"に対してリクエストを送信します。

"/"を指定した場合、ドキュメントルートに接続することになります。Amazon Linux2にapacheをインストールした場合、初期設定では/var/www/htmlです。

$ grep "/html" httpd.conf
DocumentRoot "/var/www/html"

apacheをインストールしただけでは、ドキュメントルート配下にファイルがありません。

$ yum install httpd
$  systemctl start httpd
$  ls -l /var/www/html/
total 0
$

この状態でALBのDNS名に接続すると、以下のようなTest Pageが表示されます。

ALBターゲットグループから、EC2のステータスを見ると「unhealthy Health checks failed with these codes: [403]」とあるようにヘルスチェックに失敗しています。これはヘルスチェックに応答するファイルが存在しないためです。

apacheのアクセスログ/var/log/httpd/access_logを確認すると、"/"にヘルスチェックが実行され、403を返していることがわかります。ALBはヘルスチェックに失敗したインスタンスしか存在しない場合、すべてのターゲットにリクエストをルーティングします。そのため、ファイルが存在しないためにヘルスチェックに失敗していてもTest Pageが表示されます。

172.16.0.11 - - [15/Sep/2022:08:59:06 +0000] "GET / HTTP/1.1" 403 3632 "-" "ELB-HealthChecker/2.0"
172.16.0.26 - - [15/Sep/2022:08:59:07 +0000] "GET / HTTP/1.1" 403 3632 "-" "ELB-HealthChecker/2.0"

ドキュメントルートにindex.htmlなどインデックスファイルを作成することで、ヘルスチェックに成功します。ALBのヘルスチェックで403が表示されたときは、ヘルスチェック用のファイルが存在するか確認すると良いと思います。

$ echo "Hello World" >> /var/www/html/index.html
$ tail -f /var/log/httpd/access_log
172.16.0.11 - - [15/Sep/2022:08:46:05 +0000] "GET / HTTP/1.1" 200 12 "-" "ELB-HealthChecker/2.0"
172.16.0.26 - - [15/Sep/2022:08:46:06 +0000] "GET / HTTP/1.1" 200 12 "-" "ELB-HealthChecker/2.0"

Test Pageの正体

Test Pageはドキュメントルートにインデックスページがない場合に表示されます。AL2でのapacheの場合、「/etc/httpd/conf.d/welcome.conf」でその旨が記載されています。

$ cat /etc/httpd/conf.d/welcome.conf
#
# This configuration file enables the default "Welcome" page if there
# is no default index page present for the root URL.  To disable the
# Welcome page, comment out all the lines below.
#
# NOTE: if this file is removed, it will be restored on upgrades.
#
<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>

<Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
</Directory>

Alias /.noindex.html /usr/share/httpd/noindex/index.html
$

あまりやることはないと思いますが、「/usr/share/httpd/noindex/index.html」を変更すればTest Pageを変更できます。coffee loveと追記してみました。

参考