API リクエストが TARGET_CONNECT_HOST_NOT_REACHABLE エラーで失敗する

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

現象

API リクエストが TARGET_CONNECT_HOST_NOT_REACHABLE エラーで失敗します。

エラー メッセージ

この問題が発生すると、API リクエストは次のエラーで失敗し、HTTP 503 レスポンス ステータス コードを返します。

{"fault":{"faultstring":
"Unable to resolve host invalid-target-host","detail":
{"errorcode":"protocol.http.NoResolvedHost","reason":
"TARGET_CONNECT_HOST_NOT_REACHABLE"}}}

考えられる原因

次の原因が考えられます。

原因 説明 プラットフォーム
指定されたターゲット サーバーのホストが正しくないか、無効な文字が含まれている この問題は、API プロキシ内で指定されたターゲット サーバーのホストが正しくないか、無効な文字が含まれている場合に発生する可能性があります。 Apigee、Apigee ハイブリッド
DNS ピアリングが構成されていない この問題は、Apigee デプロイで DNS ピアリングが未構成で、Apigee がドメイン名を解決できない場合に発生する可能性があります。 Apigee

原因: 指定されたターゲット サーバーのホストが正しくないか、無効な文字が含まれている

診断

  1. 関連する API プロキシに API リクエストを送信します。

    curl -ik https://dev.example.com/dns-peering-example
      HTTP/2 503
      content-type: application/json
      x-request-id: ***
      content-length: 169
      date: Thu, 02 Nov 2023 04:31:43 GMT
      via: 1.1 google
      alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

    レスポンス メッセージを確認します。

    {"fault":{"faultstring":
    "Unable to resolve host invalid-target-host","detail":
    {"errorcode":"protocol.http.NoResolvedHost","reason":
    "TARGET_CONNECT_HOST_NOT_REACHABLE"}}}
  2. レスポンスに TARGET_CONNECT_HOST_NOT_REACHABLE というエラーの理由が含まれている場合、この理由に関連しています。

解決策

  1. API プロキシの定義を確認し、定義されているターゲット ホスト名を見つけます。
  2. 指定されたターゲット ホスト名が無効であるか、無効な文字が含まれている場合は、それに応じて修正を行い、プロキシの新しいリビジョンを作成してプロキシをデプロイします。

原因: DNS ピアリングが構成されていない

診断

  1. 次の Apigee API を呼び出して、Apigee 組織が VPC ネットワークとピアリングされているかどうかを確認します。
    TOKEN=$(gcloud auth print-access-token)
    curl -H "Authorization: Bearer $TOKEN" \
      "https://apigee.googleapis.com/v1/organizations/$ORG" | jq .authorizedNetwork

    たとえば、VPC ピアリングが有効になっているかどうかを確認するには、レスポンス属性 authorizedNetwork が存在し、値が設定されているかどうかをチェックします。この条件が満たされていない場合、VPC ピアリングは有効になっていません。

    TOKEN=$(gcloud auth print-access-token)
    curl -H "Authorization: Bearer $TOKEN" \
      "https://apigee.googleapis.com/v1/organizations/example-org/" | jq .authorizedNetwork

    このレスポンスの例は、VPC ピアリングが有効になっていることを示しています。

    "projects/example-org/global/networks/shared-vpc1"
  2. 顧客側の API プロキシ デベロッパーに、このターゲット サーバーのドメイン名が内部で構成されているかどうか確認します。そうでない場合、このシナリオは該当しません。
  3. プロジェクト ID と、ターゲット エンドポイントがホストされているネットワークを確認します。
  4. 上記のネットワークで作成された DNS ピアリングのリストを表示します。Apigee 組織が VPC ネットワークとピアリングされているかどうかに応じて、次の手順を実施します。

    VPC ピアリングが有効になっている場合

    組織で VPC ピアリングが有効になっている場合は、 peered-dns-domains list コマンドを使用します。

    gcloud services peered-dns-domains list --network=NETWORK --project=PROJECT-ID

    ピアリングされた DNS ドメインが使用できない場合は空の結果が返され、使用可能な場合はピアリングされた DNS ドメインのリストが返されます。次に例を示します。

    NAME                 DNS_SUFFIX
    customer-service     customer.service.internal.
    accounts-service     accounts.service.internal.

    VPC ピアリングが有効になっていない場合

    組織で VPC ピアリングが有効になっていない場合は、次の Apigee API を使用します。

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type:application/json" \
      "https://apigee.googleapis.com/v1/organizations/ORGANIZATION/dnsZones"

    ここで、ORGANIZATION は Apigee 組織の名前です。

    組織名が dns-peering-int-4 であるレスポンスの例を次に示します。

    {
      "dnsZones": [
        {
          "name": "organizations/dns-peering-int-4/dnsZones/demo",
          "description": "latest",
          "domain": "demo.com",
          "peeringConfig": {
            "targetProjectId": "dns-peering-int-4",
            "targetNetworkId": "default"
          },
          "state": "ACTIVE"
        },
        {
          "name": "organizations/dns-peering-int-4/dnsZones/dns-peering-int-4",
          "description": "latest",
          "domain": "dns-peering-int-4.com",
          "peeringConfig": {
            "targetProjectId": "dns-peering-int-4",
            "targetNetworkId": "default"
          },
          "state": "ACTIVE"
        }
      ]
    }

    関連する DNS サフィックスの DNS ピアリング エントリがレスポンスに表示されない場合、それが問題の原因である可能性があります。解決策の手順で問題を解決してください。

解決策

  1. DNS サフィックス、プロジェクト ID、ターゲット エンドポイントがホストされているネットワークをメモします。
  2. DNS サフィックスのピアリングされた DNS ドメインを作成します。

    VPC ピアリングが有効になっている場合

    組織で VPC ピアリングが有効になっている場合は、 peered-dns-domains create gcloud コマンドを使用します。DNS サフィックスの末尾にはドットを付ける必要があります。

    gcloud services peered-dns-domains create NAME --network=NETWORK --dns-suffix=DNS-SUFFIX. --project=PROJECT-ID

    次に例を示します。

    gcloud services peered-dns-domains create orders-service --network="shared-vpc1" --dns-suffix="orders.service.internal." --project=service-project

    レスポンス:

    Operation "operations/cpdd.p25-1064980322781-fafa5fe4-b5fe-487e-830d-fff0f9a6200d" finished successfully.

    VPC ピアリングが有効になっていない場合

    組織で VPC ピアリングが有効になっていない場合は、プロジェクトのプライベート DNS ゾーンを使用して DNS ピアリング ゾーンを作成します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type:application/json" \
          "https://apigee.googleapis.com/v1/organizations/ORGANIZATION/dnsZones?dnsZoneId=DNS_ZONE_ID" \
          -d '{
            "domain": "DOMAIN",
            "description": "DESCRIPTION",
            "peeringConfig": {
               "targetProjectId": "PRODUCER_PROJECT_ID",
               "targetNetworkId": "PRODUCER_VPC_NETWORK"
            }
        }'

    ここで

    • ORGANIZATION は実際の Apigee 組織の名前です。
    • DNS_ZONE_ID は作成する DNS ゾーンの名前です。
    • DOMAIN はこのマネージド ゾーンの DNS 名です(例: example.com)。
    • DESCRIPTION は DNS ゾーンの簡単な説明です。1,024 文字以内で設定してください。
    • PRODUCER_PROJECT_ID はプロデューサー VPC ネットワークを含むプロジェクトです。
    • PRODUCER_VPC_NETWORK はお客様のプロジェクト内の VPC ネットワークです。
  3. API プロキシ エンドポイントに API リクエストを送信し、API プロキシがターゲット サーバーのドメイン名を解決してターゲット サーバーと通信できるかどうかを確認します。

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

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

  1. Google Cloud プロジェクト ID
  2. Apigee 組織
  3. API プロキシとリビジョン
  4. プライベート ドメインが作成されるネットワーク
  5. プライベート ドメインの DNS サフィックス
  6. ピアリングされた DNS ドメインの作成コマンドの完全な出力