#はじめに
今回はALBのヘルスチェックが通らず、ルーティングに苦戦した時の対処を備忘録として記事にします。結論から言うと、インスタンス側の設定が原因でした。途中までチームメンバーが担当して用意していたものを引き継いで問題解消したので、前提となる環境からメモしておきます。
#環境
- ALBはパブリックサブネットに配置
- ターゲットのインスタンスはプライベートサブネットに配置
- ターゲットインスタンスはRHEL8のEC2
- EC2はインスタンスを立ち上げたあと特に操作なし
- 後々アプリをデプロイするための環境を整える作業中
#確認したこと
- ALBやEC2インスタンスのSG(セキュリティグループ)の設定
- リスナーの設定
- ヘルスチェックの設定
- SELinuxの設定
- httpdのステータス
- index.htmlの存在
ヘルスチェックを正常化するために上記の6点を確認しました。そのうち原因は下3つ、つまるところEC2インスタンス側の設定が悪さをしていたので説明をします。
上3つの観点はAWS公式のユーザーガイドを中心に調べればすぐわかると思うのでここでは割愛します。
#SELinuxの設定
「SELinux、完璧に理解した」といえるほど自分自身これについて理解しているわけではないのですが、一言でいうと「ファイアウォールのような役割」をしているものです。AWSのRHEL8イメージでは初期設定でSELinuxが有効化されています。これが原因でALBのヘルスチェックに403エラーが返されていたと推測しました。
##対処
今回はAWS側でトラフィックの制御もしていることから、SELinuxは無効化しました。エディタで/etc/selinux/config
を編集します。
<前略>
SELINUX=disabled
<後略>
編集がすんだらAWSのコンソールを開いてインスタンスを再起動します。念のため再起動後にgetenforce
コマンドで無効化されていることを確認してください。
# getenforce
Disabled
#httpdのステータス
要はサーバーが立っているか、ヘルスチェックをしたいポートがListenしているかということです。ヘルスチェックでpingを送ってもインスタンス側で受け取れなかったらそりゃunhealthyになります。
##対処
まずはApacheが起動しているかsystemctl status httpd
あたりを入力して確かめます。deadとか書かれていれば起動していません。その場合はsystemctl start httpd
と入力して起動しておきましょう。
続けてポートでListenしているか確認します。RHEL8インスタンスは立ち上げたてではlsof
コマンドは使えません。なのでインストールします。今回は80番ポートを使うのでこれを例に一連のコマンドを記載します。
# dnf install lsof -y
# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 1234 root 4u IPv6 12345 0t0 TCP *:http (LISTEN)
httpd 1245 apache 4u IPv6 12345 0t0 TCP *:http (LISTEN)
httpd 1256 apache 4u IPv6 12345 0t0 TCP *:http (LISTEN)
httpd 1267 apache 4u IPv6 12345 0t0 TCP *:http (LISTEN)
このような表示になればApacheが起動して80ポートをListenしていることになります。
#index.htmlの存在
地味に忘れがちです。今回は特段アプリをデプロイしているわけでもなく、とりあえずWebサーバーをたててルーティングしておくのが目的だったので、コンテンツは何も置いていなかったようです。普段のブラウザでの挙動をイメージしてもらえればわかりやすいと思います。アクセス先になにもコンテンツがなければ帰ってくるのは「404 Not found」のメッセージです笑
##対処
Apacheのドキュメントルート(デフォルトなら/var/www/html
)にindex.htmlを置くだけです。中身はHelloWorldでもなんでも良いです。
#まとめ
今回はEC2インスタンスに対するALBのヘルスチェックが通らない場合の原因とその対処を、EC2側の設定に焦点を当ててまとめました。単純ゆえに見落としやすいものかもしれません。