Las solicitudes de API fallan y se muestra el error TARGET_CONNECT_HOST_NOT_REACHABLE

Estás consultando la documentación de Apigee y Apigee hybrid.
No hay documentación equivalente de Apigee Edge sobre este tema.

Síntomas

Las solicitudes a la API fallan con el error TARGET_CONNECT_HOST_NOT_REACHABLE.

Mensajes de error

Si se produce este problema, las solicitudes a la API fallarán y se mostrará el código de estado de respuesta HTTP 503 y el siguiente error:

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

Causas posibles

Se han identificado las siguientes posibles causas del síntoma mencionado anteriormente:

Causa Descripción Plataforma
El host del servidor de destino especificado es incorrecto o contiene caracteres no válidos Este problema puede producirse si el host del servidor de destino especificado en el proxy de la API es incorrecto o contiene caracteres no válidos. Apigee y Apigee Hybrid
No se ha configurado el emparejamiento de DNS Este problema puede producirse cuando Apigee no puede resolver el nombre de dominio si el peering de DNS no está configurado en las implementaciones de Apigee. Apigee

Causa: el host del servidor de destino especificado es incorrecto o contiene caracteres no válidos.

Diagnóstico

  1. Envía una solicitud a la API al proxy de API correspondiente:

    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

    y comprueba el mensaje de respuesta:

    {"fault":{"faultstring":
    "Unable to resolve host invalid-target-host","detail":
    {"errorcode":"protocol.http.NoResolvedHost","reason":
    "TARGET_CONNECT_HOST_NOT_REACHABLE"}}}
  2. Si la respuesta contiene el motivo del error TARGET_CONNECT_HOST_NOT_REACHABLE, significa que está relacionado con este motivo.

Resolución

  1. Comprueba la definición del proxy de API y busca el nombre de host de destino definido:
  2. Si el nombre de host de destino proporcionado no es válido o tiene caracteres no válidos, corríjalo, cree una nueva revisión del proxy e implemente el proxy.

Causa: el emparejamiento de DNS no está configurado

Diagnóstico

  1. Comprueba si la organización de Apigee está emparejada con una red de VPC invocando la siguiente API de Apigee:
    TOKEN=$(gcloud auth print-access-token)
    curl -H "Authorization: Bearer $TOKEN" \
      "https://apigee.googleapis.com/v1/organizations/$ORG" | jq .authorizedNetwork

    Por ejemplo, para determinar si el peering de VPC está habilitado, comprueba si el atributo de respuesta authorizedNetwork está presente y tiene un valor asignado. Si no es así, el emparejamiento de VPC no está habilitado:

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

    Esta respuesta de ejemplo indica que el emparejamiento de VPC está habilitado:

    "projects/example-org/global/networks/shared-vpc1"
  2. Verifica con el desarrollador del proxy de API del cliente si el nombre de dominio del servidor de destino está configurado internamente. Si no es así, este caso no se aplica.
  3. Busca el ID del proyecto y la red en la que se aloja el endpoint de destino.
  4. Lista las emparejamientos de DNS creados en la red anterior. Sigue los pasos que se indican a continuación en función de si la organización de Apigee está emparejada con una red de VPC o no.

    Emparejamiento de VPC habilitado

    Si tu organización tiene habilitado el emparejamiento de VPCs, usa el comando peered-dns-domains list:

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

    El resultado puede estar en blanco si no hay dominios DNS emparejados disponibles o mostrar una lista de los dominios DNS emparejados. Por ejemplo:

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

    Emparejamiento de VPC no habilitado

    Si tu organización no tiene habilitado el peering de VPC, usa la siguiente API de Apigee:

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

    Donde ORGANIZATION es el nombre de tu organización de Apigee.

    Respuesta de ejemplo, donde el nombre de la organización es 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"
        }
      ]
    }

    Si la respuesta no incluye una entrada de peering de DNS para el sufijo de DNS correspondiente, ese podría ser el motivo del problema. Sigue las instrucciones que se indican en la sección Resolución para solucionar el problema.

Resolución

  1. Anota el sufijo DNS, el ID del proyecto y la red en la que se aloja el endpoint de destino.
  2. Crea un dominio de DNS emparejado para el sufijo de DNS.

    Emparejamiento de VPC habilitado

    Si tu organización tiene habilitado el emparejamiento entre VPCs, usa el comando peered-dns-domains create gcloud. Ten en cuenta que el sufijo de DNS debe contener un punto al final:

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

    Por ejemplo:

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

    Respuesta:

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

    Emparejamiento de VPC no habilitado

    Si tu organización no tiene habilitado el emparejamiento de VPCs, crea una zona de emparejamiento de DNS con la zona DNS privada de tu proyecto:

    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"
            }
        }'

    Donde:

    • ORGANIZATION es el nombre de tu organización de Apigee.
    • DNS_ZONE_ID es el nombre de la zona DNS que quieres crear.
    • DOMAIN es el nombre de DNS de esta zona gestionada. Por ejemplo, example.com.
    • DESCRIPTION es una breve descripción de la zona DNS. Número máximo de caracteres: 1024
    • PRODUCER_PROJECT_ID es el proyecto que contiene la red de VPC del productor.
    • PRODUCER_VPC_NETWORK es la red de VPC del proyecto del cliente.
  3. Ahora, envía una solicitud de API al endpoint del proxy de API y comprueba si el proxy de API puede resolver el nombre de dominio del servidor de destino y comunicarse con él.

Debe recoger información de diagnóstico

Si el problema persiste incluso después de seguir las instrucciones anteriores, recoge la siguiente información de diagnóstico y ponte en contacto con el equipo de Asistencia de Google Cloud.

  1. Google Cloud ID de proyecto
  2. Organización de Apigee
  3. Proxy de API y revisión
  4. Red en la que se crea el dominio privado
  5. Sufijo de DNS del dominio privado
  6. El resultado completo del comando de creación del dominio de DNS emparejado