ELBからHTTP 503が返された時の調査
概要
はじめに
- クライアントからのリクエストに対して、ELBからHTTP 503のエラーが返ることがあります。今回は、ELB(主にALB)からHTTP 503が返されたときのトラブルシューティングをまとめます。
HTTP 503とは
- HTTP 503とは”Service Unavailable”であり、一時的にサーバーにアクセスできないことを示します。一般的な原因として、サーバーに多数のアクセスが集中してサーバーが処理不能となった、サーバーの最大データ転送量を超過したなどがあるようです。
- また、AWSのドキュメントには、下記の記述があり、ALBに対応したターゲットグループに有効なターゲットがいない場合が原因となるようです。しかし、全ての原因が下記とは限りませんので、もう少し深堀します。
ロードバランサーのターゲットグループに登録済みターゲットがありません。
構築時のトラブルシューティング
- システムは構築中であり、まだ疎通が確認できていない場合、以下に記載の設定が正しいかを確認します。
- ALBのリスナーPortは正しいか?、再確認します。
- ターゲットグループのPortは正しいか?、再確認します。
- ターゲットグループのフロントにあるALB がSSL/TLS接続の終端であれば、ターゲットグループは80で受けます。一方、ターゲットグループのフロントがNLB であれば、ターゲットグループは443 となりますね。
- セキュリティグループのルールは正しいか?、再確認します。
- ヘルスチェックはHealthyですか?、再確認します。必要に応じて、EC2 or ECS のWebサーバーや設定を確認します。
運用時のトラブルシューティング
503はALB or バックエンドどっちから来た?
- HTTP エラーの発生元は、下記いずれかとなります。503 が返された = ALB に原因があるとは言えません。
- ロードバランサーが HTTP エラーを返した
- ターゲットが HTTP エラーを返した
- 先ず、エラーはALB or バックエンドのどちらから返されたかを見極めます。CloudWatch には、ALBあるいはターゲットのどちらで検出されたエラーかを調査するためのメトリクスがあります。
HTTPCode_ELB_4XX_Count
またはHTTPCode_ELB_5XX_Count
HTTPCode_Target_4XX_Count
またはHTTPCode_Target_5XX_Count
- 以下、HTTPCode_ELB_5XX_Count メトリクスのサンプルです。
- 以下、HTTPCode_Target_5XX_Count メトリクスのサンプルです。
バックエンドから503が返って来た?
- バックエンドが503のエラーを返していると思われる場合、ALBのアクセスログを確認して詳細を確かめます。
- 503の発生元が分かれば、次のステップはWebサーバー(Apache,Nginx,IISなど)やアプリ側の状態、ログファイルを確認しましょう。
- ALBのアクセスログ取得方法については、下記記事を参照ください。
ALBから503が返ってきた?
- ALBが503を返していると思われる場合、前述したターゲットグループに有効なターゲットがないことが理由かもしれません。
- 先ず、ターゲットグループのヘルスチェックで、現在のステータスがHealthyかを確認しましょう。
- 次に、CloudWatchの下記メトリクスを確認します。一時的にターゲットのヘルスチェックがUnHealthy になっていた時間帯があったかもしれません。
- HealthyHostCount
- UnHealthyHostCount
ApacheにConnection timed outのエラーあり
- ALBの前段にEC2が配置されリバプロとして機能している場合、EC2 のhttpd ログに転送のエラーが記録されているかもしれません。下記Connection timed outのエラーがあれば、何らかの理由でALBに接続できなかったことが分かります。
- このケースでは、先ず下記どちらのケースに合致しないかを見極めます。合致する場合のそれぞれの内容を参照ください。次に、どちらのケースにも合致しないが、HTTP 503のエラーが発生し、Connection timed outのエラーが記録されている場合があります(ALBに接続できない)。この場合は、前述の構築時のトラブルシューティングに立ち戻り、再度通信経路で何らかの不適切な設定がないかを調査しましょう。
- リバプロがALBに接続できないケースで、下記Connection timed outのエラーが発生しており、かつ上記状況に合致しない場合は、下記事例の観点でも調査してみて下さい。
[Thu Nov 21 10:12:17.170431 2019] [proxy:error] [pid 10000:tid 1234567890] (110)Connection timed out: AH00957: HTTP: attempt to connect to xx.xx.xx.xx:80 (xxxxxxxxxx-111111111.ap-northeast-1.elb.amazonaws.com) failed
[Thu Nov 21 10:12:17.170464 2019] [proxy_http:error] [pid 10000:tid 1234567890] [client xx.xx.xx.xx:xxxxx] AH01114: HTTP: failed to make connection to backend: xxxxxxxxxx-111111111.ap-northeast-1.elb.amazonaws.com
不正な攻撃は受けていないか?
- DDos攻撃や不正アクセスなど、セキュリティホールを利用してリソースに過剰な負荷が掛かっていないかを確認しましょう。セキュリティグループのInboundは不必要にオープンされていませんか?
- CloudWatch メトリクスでALBのRequestCount を確認します。
- ALBにアクセスログを設定している場合は、異常なアクセスが発生しているかを確認します。
ALBのアクセスは急増していないか?
- 念のため、ALBへのアクセスが急増していないかを確認しましょう。ALBは負荷に合わせて自動的にスケールアウトします。但し、EC2 Auto Scalingと同様にスケールアウトには数分の時間が掛かります。ALBに対して、アクセスの急増があった場合、ALBは処理しきれず、503を返す場合があります。
- ALBへのアクセス増が予測できる場合は、ELBの暖気申請(Pre-warming)をして、あらかじめスケールアウトさせることが可能です。但し、ELBの暖気申請は、Bussinessプラン以上の契約が必要となります。
参考
- ALBから返されるステータスコードについて、下記記事でまとめています。参照ください。
- Apacheをリバースプロキシとして使用し、かつバックエンドにALBを配置する構成の落とし穴について、事例紹介しています。