Application Load Balancer の使用中に返された 504 エラーをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2022 年 4 月 25 日

Application Load Balancer のアクセスログ、Amazon CloudWatch メトリクス、または Application Load Balancer 経由でサービスに接続したときに HTTP 504 エラーが表示されます。これを修正するにはどうすればよいですか?

簡単な説明

HTTP 504 エラーは、ゲートウェイまたはプロキシがタイムアウトしたことを示す HTTP ステータスコードです。

Application Load Balancer HTTP 504 エラーは、次の場合に発生する可能性があります。

  • ロードバランサーが、接続のタイムアウト時間 (10 秒間) 以内に、ターゲットとの接続を確立できなかった。
  • ロードバランサーは接続を確立しているが、アイドル状態のタイムアウト時間以内にターゲットが応答しなかった。
  • エフェメラルポート (1024-65535) での、ターゲットからロードバランサーノードへのトラフィックが、サブネット用のネットワークア ACL で許可されていない。
  • ターゲットが、エンティティ本体よりも大きい Content-Length ヘッダー値を返している。ロードバランサーが、不足しているバイトを待ってタイムアウトした。
  • ターゲットは AWS Lambda 関数であり、接続タイムアウトの期限が切れる前にサービスが応答しなかった。

解決方法

ロードバランサーのアイドルタイムアウトを確認し、必要に応じて変更します。

バックエンドインスタンスが設定されたアイドルタイムアウト期間内にリクエストに応答しなかった場合、ロードバランサーの HTTP 504 エラーが発生する可能性があります。デフォルトでは、Application Load Balancer のアイドルタイムアウトは 60 秒です。

CloudWatch メトリクスが有効になっている場合は、Application Load Balancer の CloudWatch メトリクスを確認します。HTTPCode_ELB_5XX メトリクスは、ロードバランサーから発生した 504 エラーを示します。HTTPCode_ELB_504_Count メトリクスデータポイントがない場合、504 エラーはロードバランサーではなくアプリケーションサーバーによって返されています。

CloudWatch メトリクス TargetResponseTime の最大値と平均値を確認します。タイムアウト値は、ロードバランサーのリクエストがターゲットから受信されてから経過した時間を示している場合があります。

このエラーを解決するには:

HTTP リクエストがアイドルタイムアウト期間内に完了するように、ロードバランサーのアイドルタイムアウトを変更します。

- または -

HTTP リクエストにより速く応答するようにアプリケーションを変更します。アプリケーションが、設定されたアイドルタイムアウトよりも応答に時間がかからないようにしてください。

(オプション) バックエンドウェブサーバーのアプリケーションログに次のカスタムフィルターを追加して、応答時間が遅くなる原因を特定します。

Apache ウェブサーバー

a- Apache : %D in log format
b- Nginx: $request_time and $upstream_response_timein log format
c- IIS: “time-taken” in log format
d- Apache Tomcat Access logs: %D in log format

ロードバランサーが登録済みのターゲットを持つトラフィックを許可していることを確認します

ロードバランサーとバックエンドターゲットに関連付けられているネットワークセキュリティグループが、トラフィックポートとヘルスチェックポートで双方向のトラフィックを相互に許可していることを確認します。エフェメラルポート (1024-65535) での、ターゲットからロードバランサーノードへのトラフィックが、サブネット用のネットワークア ACL で許可されていることを確認します。

注意:Application Load Balancer には、次のセキュリティグループルールを使用することがベストプラクティスです。

CloudWatch メトリクス TargetConnectionErrorCount合計統計を確認すると、ポジティブなデータポイントが表示される可能性があります。例えば、ロードバランサーとターゲットの間で、正常に確立されなかった接続の数です。

詳細については、「ロードバランサーのアイドルタイムアウト設定を構成する」を参照してください。

接続タイムアウトの期限が切れる前に、Lambda 関数が応答することを確認してください

ターゲットが Lambda 関数の場合は、パフォーマンスメトリクス期間と最大統計情報をチェックして、イベントの処理時間を確認します。詳細については、「パフォーマンスメトリクスの使用」を参照してください。