スキップしてコンテンツを表示

Application Load Balancer の使用時に発生する 504 エラーのトラブルシューティング方法を教えてください。

所要時間2分
0

Application Load Balancer のアクセスログまたは Amazon CloudWatch メトリクスに、ELB_504 と表示されるエラーをトラブルシューティングしたいです。使用しているサービスに Application Load Balancer 経由で接続する際に、HTTP 504 エラーが発生することもあります。

簡単な説明

ゲートウェイまたはプロキシがタイムアウトすると、HTTP 504 エラーが発生します。Application Load Balancer での HTTP 504 エラーは、次の原因で発生する可能性があります。

  • ロードバランサーが、接続タイムアウト (10 秒) の期限内にターゲットへの接続を確立できなかった。
  • ロードバランサーがターゲットに接続する際に、SSL ハンドシェイクのタイムアウトが発生した。
    注: SSL ハンドシェイクのタイムアウトは、10 秒から変更できません。
  • ロードバランサーはターゲットへの接続を確立したが、アイドルタイムアウト期間が経過するまでにターゲットが応答しなかった。
  • ターゲットがエンティティ本体よりも大きい Content-Length ヘッダー値を返し、ロードバランサーがタイムアウトした。
  • 大量のトラフィックが原因で、ターゲットの応答が遅くなった。
  • ターゲットは AWS Lambda 関数で、サービスが接続タイムアウトの期限内に応答しなかった。

解決策

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

CloudWatch メトリクス TargetConnectionErrorCountSum 統計情報を確認します。データポイント数が 0 ではなく正の値である場合は、ロードバランサーとターゲットの間の接続に問題があります。

これらの問題を解決するには、ロードバランサーとバックエンドターゲットに関連付けられているネットワークセキュリティグループを確認します。ネットワークセキュリティグループが、トラフィックおよびヘルスチェック用のポートで、ロードバランサーとターゲット間の両方向のトラフィックを許可していることを確認してください。サブネットのネットワークアクセス制御リスト (ネットワーク ACL) で、ターゲットからロードバランサーノードへのトラフィックをエフェメラルポート (1024 ~ 65535) で許可していることを確認します。

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

ロードバランサーのメトリクスを確認する

ターゲットが Unhealthy とマークされている理由を特定するには、Application Load Balancer の CloudWatch メトリクスを確認します。HTTPCode_ELB_504_Count メトリクスのデータがない場合は、ロードバランサーではなく、アプリケーションサーバーが 504 エラーを返したことを示しています。この構成では 504 エラーが発生する可能性があるため、TargetResponseTime の最大値がタイムアウトの値を頻繁に超過しているかどうかを確認します。

さらに、リソースタイプに応じて、ターゲットにおける次の CPU およびメモリ使用率メトリクスを確認します。

  • Amazon Elastic Compute Cloud (Amazon EC2) の場合は、CPUUtilization メトリクスを確認します。EC2 インスタンスは、デフォルトでは CloudWatch にメモリメトリクスを送信しませんが、カスタムメモリメトリクスを送信することはできます。
  • Amazon ECS タスクの場合は、CPUUtilization および MemoryUtilization メトリクスを確認します。いずれかの値が 1 (100%) の場合、タスクは応答しなくなります。
  • Lambda 関数の場合は、Duration メトリクスを確認します。Duration がロードバランサーのアイドルタイムアウト値より長く続く場合、Gateway timeout エラーが発生します。

リソースの可用性を向上させる

ターゲットの CPU 使用率が高い場合、応答しなくなる可能性があります。

この問題を解決するには、ターゲットで次のリソースを増やします。

アプリケーションが HTTP リクエストに応答するときの効率が上がるように、コードを更新します。設定したアイドルタイムアウト期間よりもアプリケーションの応答時間が長くならないようにします。デフォルトでは、Application Load Balancer アイドルタイムアウトは 60 秒です。必要に応じて、ロードバランサーのアイドルタイムアウトを増やしてください。

注: ターゲットで完了する必要があるコンピューティング操作の数が多い場合にのみ、アイドルタイムアウト値を増やすことがベストプラクティスです。それ以外の場合は、代わりにターゲットのリソース使用量を最適化することをおすすめします。

需要に基づき、ターゲットをスケーリングする

需要に基づいてターゲットをスケーリングするには、お使いの構成に応じて次のアクションを実行します。

注: Lambda 関数の呼び出し時に、関数は自動的にスケーリングされます。

外部依存関係を確認する

アプリケーションがマイクロサービスアーキテクチャを使用する場合は、データベースや API などの外部依存関係がターゲットの応答時間に影響します。

次の一般的な外部依存関係において、問題の有無を確認してください。

  • Amazon Relational Database Service (Amazon RDS) では、CloudWatch メトリクス ReadLatencyWriteLatencyDatabaseConnections を確認します。
  • Amazon Simple Queue Service (Amazon SQS) キューでは、CloudWatch メトリクス ApproximateAgeOfOldestMessage および NumberOfMessagesDelayed を確認します。
  • Amazon Simple Storage Service (Amazon S3) バケットでは、CloudWatch メトリクス FirstByteLatencyTotalRequestLatency4xxErrors5xxErrors を確認します。
  • Amazon Cognito 認証サービスでは、CloudWatch メトリクス TokenRefreshSuccesses を確認し、ThrottlingException エラーの有無を確認します。

パフォーマンスのボトルネックの原因を特定するには、次の手順を実行します。

Compute Optimizer を使用して今後の問題を回避する

AWS Compute Optimizer を使用すると、Amazon EC2、Amazon ECS、Lambda リソースの使用状況に関するインサイトを取得できます。Compute Optimizer は、リソースの使用率が高すぎる時期を検出するため、タイムアウトを回避するのに役立ちます。ワークロードを最適化する方法に関するベストプラクティスを取得することもできます。

関連情報

HTTP 504: Gateway timeout

Elastic Load Balancing で、Application Load Balancer の遅延が大きい場合のトラブルシューティング方法を教えてください

Application Load Balancer での認証に関する問題をトラブルシューティングする方法を教えてください

Classic Load Balancer の使用時に返される 504 エラーをトラブルシューティングする方法を教えてください

コメントはありません

関連するコンテンツ