- 1. 概要
— 1.1. はじめに
— 1.2. HTTP 503とは - 2. 構築時のトラブルシューティング
- 3. 運用時のトラブルシューティング
— 3.1. 503はALB or バックエンドどっちから来た?
— 3.2. バックエンドから503が返って来た?
— 3.3. ALBから503が返ってきた?
— 3.4. ApacheにConnection timed outのエラーあり
— 3.5. ALBのアクセスは急増していないか? - 4. 参考
概要
はじめに
- クライアントからのリクエストに対して、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のエラーがあれば、何らかの理由でELBに接続できなかったことが分かります。
- このケースでは、先ず下記どちらのケースに合致しないかを見極めます。合致する場合のそれぞれの内容を参照ください。次に、どちらのケースにも合致しないが、HTTP 503のエラーが発生し、Connection timed outのエラーが記録されている場合があります(ALBに接続できない)。この場合は、前述の構築時のトラブルシューティングに立ち戻り、再度通信経路で何らかの不適切な設定がないかを調査しましょ う。
[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
ALBのアクセスは急増していないか?
- 念のため、ALBへのアクセスが急増していないかを確認しましょう。ALBは負荷に合わせて自動的にスケールアウトします。但し、EC2 Auto Scalingと同様にスケールアウトには数分の時間が掛かります。ALBに対して、アクセスの急増があった場合、ALBは処理しきれず、503を返す場合があります。
- ALBへのアクセス増が予測できる場合は、ELBの暖気申請(Pre-warming)をして、あらかじめスケールアウトさせることが可能です。但し、ELBの暖気申請は、Bussinessプラン以上の契約が必要となります。
参考
- ALBから返されるステータスコードについて、下記記事でまとめています。参照ください。