API Gateway で API HTTP 504 タイムアウトエラーをトラブルシューティングする方法を教えてください。

最終更新日: 2022 年 8 月 17 日

Amazon API Gateway を使用して REST API、HTTP API、または Websocket API を呼び出すと、HTTP 504 エラーステータスコードが表示されます。このエラーのトラブルシューティング方法を教えてください。

簡単な説明

統合リクエストが API Gateway REST API の最大統合タイムアウトパラメータよりも長くかかる場合、API Gateway は HTTP 504 ステータスコードを返します。

API Gateway から 504 タイムアウトエラーをトラブルシューティングするには、まず Amazon CloudWatch 実行ログでエラーの原因を特定して確認します。次に、次の方法の 1 つまたは複数を使用して、統合リクエストの実行時間を減らしてタイムアウトしないようにします。

解決方法

Amazon CloudWatch Logs の 504 エラーの原因を特定して確認するには

1.    Rest APIWebsocket API の場合は、504 エラーの API ゲートウェイ実行ログを設定します。HTTP API の場合は、ログを有効にして CloudWatch ログにログを書き込みます。

2.    API で 504 エラーの手動での再現を試みます。

3.    CloudWatch コンソールで、エラーを受け取った統合の API Gateway 実行ログを表示します。

4.    CloudWatch Logs でリクエスト ID を追跡します。統合でタイムアウトがある場合は、「変換後のエンドポイントリクエスト本文:」行の後にタイムアウトエラーが原因で、実行が失敗しましたと表示されます。詳細については、「CloudWatch Logs で API Gateway REST API エラーを見つけるにはどうすればよいですか?」を参照してください。

5.    API のアクセスログを有効にし、次のパラメーター変数を使用してエラーの原因を診断します。

$context.integration.status: インテグレーションから返されるステータスコード。Lambda プロキシインテグレーションの場合、これは Lambda 関数コードが返すステータスコードです。
$context.integrationStatus: Lambda プロキシ統合の場合、このパラメータは、バックエンド Lambda 関数からではなく、AWS Lambda から返されるステータスコードを表します。
$context.integrationLatency: 統合レイテンシー (ミリ秒)。

詳細については、「データモデル、オーソライザー、マッピングテンプレート、および CloudWatch アクセスログ記録用の $context 変数」を参照してください。

6.    次の手順を実行して、エラーの原因を特定します。

関連付けられた統合エンドポイントが呼び出されたことを確認します。

インテグレーションがリクエストの処理を完了し、それに対応して API Gateway に応答するまでにかかった時間を確認します。

7.    統合が呼び出されなかった場合は、リクエストを再試行します。(このエラーは、API Gateway サービスの一時的なネットワーク障害が原因で発生する可能性があります)。
注: アプリケーションが冪等であることを確認してください。これにより、API リクエストを再試行するときにデータの競合を回避できます。

- または -

インテグレーションが呼び出されても 504 エラーメッセージが返される場合は、インテグレーションのランタイムを減らしてみてください。HTTP API の場合は、 最大統合リクエストタイムアウトパラメータを増やしてみることができます

注: API Gateway REST API のデフォルトの最大統合タイムアウトは 29 秒です。HTTP API の場合、タイムアウトは最大値 30 秒まで設定できます。

統合の実行時間を減らすには

  • バックエンド統合には、API Gateway がクライアントに HTTP レスポンスを送信するために必要なロジックのみが含まれていることを確認します。依存しないロジックまたは後処理ロジックは、AWS Lambda などの別のサービスに移動することを検討してください
  • ネットワークのレイテンシーが 504 エラーの原因である場合は、クライアント側のアプリケーションで再試行ロジックを実装します。
  • プラットフォームの最適化のベストプラクティスに従って、バックエンド統合のパフォーマンスを改善します。
  • バックエンド Lambda 関数の非同期呼び出しを設定することを検討してください。