API 要求失敗,並顯示 TARGET_CONNECT_HOST_NOT_REACHABLE 錯誤

您目前查看的是 ApigeeApigee Hybrid 說明文件。
這個主題沒有對應的 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 Hybrid
未設定 DNS 對等互連 如果 Apigee 部署作業未設定 DNS 對等互連,Apigee 就無法解析網域名稱,因此可能會發生這個問題。 Apigee

原因:指定的目標伺服器主機不正確或含有無效字元

診斷

  1. 傳送 API 要求至相關 API Proxy:

    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 Proxy 定義,找出定義的目標主機名稱:
  2. 如果指定目標主機名稱無效或含有無效字元,請修正相關問題,建立新的 Proxy 修訂版本,然後部署 Proxy。

原因:未設定 DNS 對等互連

診斷

  1. 呼叫下列 Apigee API,檢查 Apigee 機構是否與虛擬私有雲網路對等互連:
    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 Proxy 開發人員確認,這個目標伺服器網域名稱是否已在內部設定。如果不是,則不適用這個情境。
  3. 找出專案 ID 和目標端點所在的網路。
  4. 列出上述網路中建立的 DNS 對等互連。請根據 Apigee 機構是否與 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 對等互連,請使用下列 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 對等互連,請使用 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 對等互連,請在專案中建立 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 區域的簡短說明。字元上限:1024
    • PRODUCER_PROJECT_ID 是包含供應商虛擬私有雲網路的專案。
    • PRODUCER_VPC_NETWORK 是客戶專案中的虛擬私有雲網路。
  3. 現在,請將 API 要求傳送至 API Proxy 端點,並驗證 API Proxy 是否能解析目標伺服器網域名稱,以及與目標伺服器通訊。

必須收集診斷資訊

如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊,然後與 Google Cloud 客服團隊聯絡。

  1. Google Cloud 專案 ID
  2. Apigee 組織
  3. API Proxy 和修訂版本
  4. 建立私有網域的網路
  5. 私有網域的 DNS 後置字串
  6. 對等互連 DNS 網域建立指令的完整輸出內容