504 ゲートウェイ タイムアウト - ターゲット読み取りタイムアウト

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
このトピックに対応する Apigee Edge のドキュメントはありません。

症状

この問題は、Gateway Timeout エラー(HTTP ステータス 504)として示されます。

エラー メッセージ

このエラーは、API MonitoringDebug などのツールに表示されることがあります。TARGET_READ_TIMEOUT は Apigee ランタイムがリクエストの実行中にターゲットからタイムリーなレスポンスを受信しなかった場合に発生します。

デフォルトのターゲット読み取りタイムアウト値(io.timeout.millis)は 55 秒です。55 秒経過してもターゲットが応答しない場合、Apigee は次のエラーをスローします。

{"fault":{"faultstring":"Gateway Timeout",
  "detail":{"errorcode":"messaging.adaptors.http.flow.GatewayTimeout",
  "reason":"TARGET_READ_TIMEOUT"}}}

考えられる原因

原因 説明 トラブルシューティングの実施対象
ターゲットからの応答が遅い ターゲットからタイムリーなレスポンスが届かない状況です。 Apigee X と Apigee ハイブリッド
TargetServer の接続性の問題 TargetEndpoint で <LoadBalancer> が構成されている場合、ターゲットとの一般的な接続性の問題が発生します。 Apigee X と Apigee ハイブリッド

原因: ターゲットからの応答が遅い

診断

Apigee の Debug ツールを使用することで、ターゲットからの応答が遅い問題を診断できます。

  1. API プロキシのデバッグ セッションを作成します。
  2. デバッグ セッションでリクエストを送信してデバッグ出力を調べます。

上記の例からわかるように、ターゲット リクエストがデフォルトのターゲット タイムアウトの上限である 55 秒を超えています。時間の上限は変更が可能です。タイムアウトを変更した場合、ターゲット リクエストの時間の長さは設定したタイムアウトと同じになります。たとえば、タイムアウトが 10 秒の場合、ターゲット リクエストは 10 秒後にタイムアウトします。このような「ターゲットからの応答が遅い」挙動は、ターゲットが時間内にリクエストに応答していないことを明確に示しています。

解決策

応答が遅いターゲットは使用しないことをおすすめします。たとえば、通常のターゲット レイテンシが 50 ms で、実際のレイテンシが 55,000 ms の場合、ターゲットに問題があるかどうかの調査が必要になることがあります。

タイムアウトを増やす必要がある場合は、次の操作を行います。

  1. プロキシ エディタの [Develop] タブをクリックします。
  2. ナビゲーション パネルで、影響を受けるターゲット エンドポイントを選択します。
  3. XML エディタで、HTTPTargetConnection の XML 要素を見つけます。

  4. <HTTPTargetConnection> 要素に io.timeout.millis プロパティを追加し、新しい上限時間をミリ秒単位で指定します。次に例を示します。
    <HTTPTargetConnection>
      <URL>https://my-very-slow-target.example.com</URL>
      <Properties>
        <Property name="io.timeout.millis">120000</Property>
      </Properties>
    </HTTPTargetConnection>

    上記の例では、タイムアウトが 120 秒に引き上げられています。なお、タイムアウトの上限は 300 秒です。詳細については、エンドポイント プロパティのリファレンスをご覧ください。

  5. 新しいリビジョンを保存し、プロキシをデプロイします。

問題が解決しない場合は、下記の診断情報の収集が必要な場合をご覧ください。

原因: TargetServer の接続性の問題

診断

<LoadBalancer> のエンドポイント プロパティを構成する際、接続性の問題の正確な原因は明らかになりません。ただし、ターゲット リクエストの経過時間から接続性の問題の原因を推測できる可能性もあります。<LoadBalancer> 要素をすべて削除し、プロキシ内で直接ターゲットにアクセスするデバッグ方法を試してみてください。

問題を診断するには、Debug ツールを使用します。

  1. API プロキシのデバッグ セッションを作成します。
  2. デバッグ セッションでリクエストを送信してデバッグ出力を調べます。

上記の例では、タイムアウトが発生するまでに 9 秒かかっています。55 秒ではないため、エラーの原因はターゲットからの応答が遅いためにタイムアウト上限を超えたことではないことがわかります。デフォルトでは、TargetEndpoint で <LoadBalancer> 要素が使用されている場合、Apigee はさらに 2 回接続を再試行します。接続が合計 3 回試行されていること、そして接続エラーになるデフォルトのタイムアウトが 3 秒(connect.timeout.millis)であることから、接続性の問題があると推測できます。

解決策

問題が接続のタイムアウトであることが確認できた場合は、VPC ピアリングにおいて TARGET_CONNECT_TIMEOUT で 503 Service Unavailable エラーが発生するをご覧ください。

その他の問題については、<LoadBalancer> 要素を削除してデバッグすることで正確なエラーコードを把握し、そのコードをエラーカタログで確認します。

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の診断情報を収集して Google Cloud サポートに連絡してください。

  1. プロジェクト ID と Apigee 組織名
  2. プロキシ名と環境
  3. 問題が発生する期間
  4. 問題の発生頻度
  5. ターゲット ホスト名
  6. 問題を示すデバッグ セッション