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 请求:

    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 区域的简要说明。字符数上限:1024
    • PRODUCER_PROJECT_ID 是包含提供方 VPC 网络的项目。
    • PRODUCER_VPC_NETWORK 是客户项目中的 VPC 网络。
  3. 现在,向 API 代理端点发送 API 请求,并验证 API 代理是否可以解析目标服务器域名并与目标服务器进行通信。

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后与 Google Cloud Customer Care 联系。

  1. Google Cloud 项目 ID
  2. Apigee 组织
  3. API 代理及修订版本
  4. 创建了专用网域的网络
  5. 专用网域的 DNS 后缀
  6. 对等互连 DNS 网域创建命令的完整输出