概要
ALBのヘルスチェックにハマったので、そのときに見直すところのメモ。
構成
- ALB
- ECS
- Nignxコンテナ
- Railsコンテナ
確認
ヘルスチェックのエンドポイントが間違っていないか
ALBのターゲットグループに設定するヘルスチェックのエンドポイントが間違っていないか確認する。単純にtypoなのか、ヘルスチェック用のエンドポイントを用意していないのか見直す。
自分がヘルスチェック用エンドポイントを作成している場合は気がつきやすいが、そうでない場合は開発者に確認しておく。/health
だと思っていたが実は/readme.txt
だったなど。。。
ヘルスチェックのエンドポイントが間違っていないことが分かったら、curl
コマンドでhttpレスポンスコードがちゃんと200を返しているか確認してみる。
# Railsコンテナ内で実行 $ curl localhost:3000/healthcheck -H 'Host:<your domain name>' -I
Railsコンテナからのレスポンスが問題なければ、Nginxコンテナ経由でエンドポイントにリクエスト送ってちゃんと正常なレスポンスを返すか確認する。ここで上手くいかないとNginxの設定がミスっている可能性があるので、設定ファイルを見直す。
Nginxコンテナの中にALBのヘルスチェック結果のログが吐かれているのでそれも確認しておく。(ヘルスチェックログ:/var/log/access.log
)
# Nginxコンテナ内で実行 $ curl localhost:80/healthcheck -H 'Host:<your domain name>' -I
続いてコンテナが乗っているEC2インスタンスからヘルスチェックのエンドポイントにリクエストを送ってみる。リクエストを送るポートはdocker ps
コマンドで確認する。
# EC2インスタンス内で実行 $ curl localhost:xxxx/healthcheck -H 'Host:<your domain name>' -I
ECSクラスタのセキュリィグループが間違っていないか
gateway timeout 504
がヘルスチェックで返ってくる場合は、ECSコンテナのセキュリティグループにてALBに設定しているセキュリィグループを許可していない可能性がある。ここでALBからのリクエストが許可されていないとそもそもEC2インスタンスにリクエストが届かないので504エラーが返ってくる。
ヘルスチェックのタイムアウト時間が短すぎないか
コンテナが立ち上がるまでの処理に時間がかかっていると、コンテナが立ち上がる前にヘルスチェックが失敗と見なされてしまうので起動時に重い処理をentrypoint.sh
で実行している場合は、ALBのタイムアウト時間を長めにとっておく。
おしまい