Errore 503 Servizio non disponibile del peering VPC con TARGET_CONNECT_TIMEOUT

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Non esiste una equivalente Documentazione di Apigee Edge per questo argomento.

Sintomo

Questo problema si manifesta sotto forma di errori "503 - Service Unavailable" (503 - Servizio non disponibile) in Monitoraggio API, Debug o altri strumenti. Il motivo "TARGET_CONNECT_TIMEOUT" indica un timeout della connessione tra l'istanza Apigee e il target quando si utilizza il peering VPC.

L'errore non deve essere confuso con altri errori di timeout, ad esempio 504 Gateway Timeout.

Messaggio di errore

Questo è l'errore tipico della sessione di debug o del payload della risposta. Nota il motivo: TARGET_CONNECT_TIMEOUT.

{"fault":{"faultstring":"The Service is temporarily unavailable",
"detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable",
"reason":"TARGET_CONNECT_TIMEOUT"}}}

Possibili cause

Tieni presente che queste cause sono specifiche per Apigee configurato con il peering VPC. Consulta: Opzioni di networking Apigee. Se il target è PSC (Endpoint Allegato), consulta la guida pratica di PSC .

Causa Descrizione
Configurazione errata delle route Le route di destinazione non vengono esportate nel peering con l'istanza Apigee.
Problema di connettività alla destinazione La destinazione non è sempre in grado di accettare una connessione TCP.
Lista consentita di IP nel target con alcuni o tutti gli IP NAT di Apigee non aggiunti Non tutti gli IP Apigee NAT sono nella lista consentita nella destinazione.
Esaurimento delle porte IP NAT Porte NAT non sufficienti per il traffico.
Il valore connect.timeout.millis è impostato su un valore troppo basso L'impostazione del timeout della connessione è troppo bassa sul lato Apigee.

Passaggi di diagnostica comuni

Lo strumento Debug è un strumento essenziale per acquisire e valutare i seguenti dettagli sul problema:

  • Durata totale della richiesta. In genere sono necessari tre secondi (valore predefinito connect.timeout.millis) prima che si verifichi un timeout della connessione. Se noti una durata inferiore, controlla la colonna Target Configurazione degli endpoint.
  • Nome host e indirizzo IP di destinazione. L'indirizzo IP errato visualizzato potrebbe indicare un problema relativo al DNS. Potresti anche notare una correlazione tra diversi IP target e il problema.
  • Frequenza. Sono necessari approcci diversi a seconda che il problema sia intermittente o persistente.

Causa: configurazione errata della route

Diagnosi

Se il problema persiste, anche se si è verificato di recente, potrebbe essere causato da un'errata configurazione del percorso.

Ciò potrebbe interessare i target sia interni (instradati all'interno di un VPC con peering) sia esterni (internet).

  1. Identifica innanzitutto l'indirizzo IP della destinazione risolta dall'istanza Apigee. Uno dei metodi è utilizzare una sessione di debug. In Debug, vai ad AnalyticsPublisher (o AX nella versione classica di Debug):

    Finestra di debug

    Cerca il valore target.ip sul lato destro dello schermo.

    In questo esempio, l'IP è 10.2.0.1. Poiché questo intervallo è privato, richiede alcune mettere in atto misure di routing per far sì che Apigee possa raggiungere il target.

    Tieni presente che se la destinazione è su internet, devi seguire questo passaggio se i Controlli di servizio VPC sono abilitati per Apigee, poiché impediscono la connettività a internet.

  2. Prendi nota della regione in cui è stato eseguito il deployment dell'istanza Apigee interessata. Nella UI di Apigee nella console Cloud, fai clic su Istanze. Nel campo Località puoi per trovare la regione esatta dell'istanza.

    Istanze della console Apigee
  3. Nel progetto in peering con Apigee, vai alla Rete VPC -> VPC nella sezione peering di rete della UI. Tieni presente che se utilizzi VPC condiviso, questi passaggi devono essere eseguiti nel progetto host anziché nel progetto Apigee.

    Peering di rete VPC
  4. Fai clic su servicenetworking-googleapis-com, seleziona il ROUTE ESPORTATI e filtra in base alla regione ottenuta nel passaggio 2.

    Questo esempio mostra la route 10.2.0.0/24 come esportata e include il target di esempio 10.2.0.1 IP. Se non vedi un percorso corrispondente al tuo target, significa che è la causa del problema.

    Dettagli connessione in peering

Risoluzione

Esamina l'architettura di rete e assicurati che le route vengano esportate nel peering VPC con Apigee. Molto probabilmente il percorso mancante è statici o dinamici. Mancanza di route dinamiche necessarie indica un problema con la caratteristica corrispondente, ad esempio: Cloud Interconnect.

Tieni presente che il peering transitivo non è supportato. In altre parole, se La rete VPC N1 è in peering con N2 e N3, ma N2 e N3 non sono collegate direttamente, rete VPC N2 non può comunicare con la rete VPC N3 tramite peering di rete VPC.

Puoi leggere Pattern di networking verso sud per ulteriori informazioni.

Causa: problema di connettività al target

Diagnosi

La destinazione potrebbe non essere raggiungibile dal VPC o non essere in grado di accettare una connessione. Le due opzioni sono disponibili per diagnosticare il problema.

Connectivity Tests (indirizzi IP di destinazione privati)

Se la destinazione si trova in una rete privata, puoi utilizzare la funzionalità Test di connettività per diagnosticare le cause più comuni.

  1. Identifica l'indirizzo IP della destinazione risolto dall'istanza Apigee. Uno dei metodi è per utilizzare una sessione di Debug.

    In Debug, vai ad AnalyticsPublisher (o AX nel debug classico). Cerca il valore target.ip sul lato destro dello schermo.

    In questo esempio, l'IP è 10.2.0.1. Si tratta di un indirizzo IP privato, il che significa che possiamo utilizzare il test di connettività.

    AnalyticsPublisher
  2. Prendi nota dell'indirizzo IP dell'istanza Apigee che non riesce a connettersi al target. In Istanze nella console Apigee, trova l'indirizzo IP dell'istanza Apigee nel campo Indirizzo IP.

    Istanze che mostrano l'indirizzo IP
  3. Vai a Connectivity Tests e fai clic su Crea test di connettività. Fornisci i seguenti dettagli:
    1. Indirizzo IP di origine: utilizza l'IP dell'istanza Apigee ottenuto in Passaggio 2 riportato sopra. Tieni presente che non si tratta dell'indirizzo IP di origine esatto utilizzato da Apigee per inviare una richiesta al target, ma è sufficiente per il test, in quanto si trova nella stessa subnet.
    2. Questo è un indirizzo IP usato in Google Cloud:lascia deselezionata questa opzione a meno che il parametro in uno dei tuoi progetti Google Cloud. Se controlli questo valore, fornisci anche il valore progetto e rete.
    3. Inserisci l'indirizzo di destinazione (passaggio 1) e la porta come Indirizzo IP di destinazione e Porta di destinazione.
    Crea test di connettività
  4. Fai clic su Crea e attendi il completamento della prima esecuzione del test.
  5. Nell'elenco dei test di connettività, fai clic su Visualizza per visualizzare i risultati dell'esecuzione.
  6. Se il risultato è "Impossibile da raggiungere", significa che hai un problema con la configurazione. Lo strumento dovrebbe indirizzarti alla Documentazione sugli stati di Connectivity Tests per procedere. Se lo stato è "Reachable" (Raggiungibile), vengono esclusi molti problemi di configurazione. Tuttavia, questo non garantisce che il target sia raggiungibile. Non è stato effettuato alcun tentativo reale di stabilire una connessione TCP con il target. Solo la prossima diagnostica riportata di seguito ti sarà utile per testarlo.

    Risultati del test di connettività


Test di connettività delle VM (tutti i target)

  1. Nello stesso VPC in peering con Apigee, crea un'istanza VM su Linux.
  2. Esegui test di connettività dalla VM, preferibilmente nel momento in cui il problema riproducibili da Apigee. Puoi utilizzare telnet, curl e altre utilità per stabilire una connessione. Questo esempio di curl viene eseguito in un ciclo con un timeout di tre secondi. Se curl non è in grado di stabilire una connessione TCP in tre secondi, non va a buon fine.
    for i in {1..100}; do curl -m 3 -v -i https://[TARGET_HOSTNAME] ; sleep 0.5 ; done
  3. Controlla l'output completo e cerca questo errore:
    * Closing connection 0
     curl: (28) Connection timed out after 3005 milliseconds

    La presenza di questo errore conferma che il problema è riproducibile al di fuori di Apigee.

    Tieni presente che, se visualizzi altri errori, ad esempio errori relativi a TLS, codici di stato errati e così via, non confermano il timeout della connessione e non sono correlati a questo problema.

  4. Se la destinazione richiede l'inserimento nella lista consentita degli IP, potresti non essere in grado di eseguirne il test da una VM, a meno che non inserisci anche l'IP di origine dell'istanza VM nella lista consentita.

Risoluzione

Se hai identificato un problema in base ai Connectivity Tests, procedi con la documentazione passaggi per la risoluzione del problema.

Se il timeout viene riprodotto da una VM, non esistono indicazioni precise su come risolvere il problema sul lato di destinazione. Quando il timeout della connessione è riproducibile all'esterno di Apigee, a esaminare ulteriormente il problema dal VPC. Prova a testare la connettività il più vicino possibile al target.

Se la destinazione è protetta da una connessione VPN, potresti essere in grado di testarla anche dalla rete locale in ogni rete.

Se la destinazione è su internet, potresti provare a riprodurre il problema all'esterno della console Google Cloud.

Se il problema si verifica nelle ore di punta, la destinazione potrebbe essere sovraccarica di connessioni.

Se in questa fase devi aprire una richiesta all'assistenza Google Cloud, non devi più selezionare il componente Apigee, poiché il problema ora è riproducibile direttamente dal VPC.

Causa: lista consentita IP nel target con alcuni o tutti gli IP NAT di Apigee non aggiunti

Diagnosi

Riguarda le destinazioni esterne (Internet) con la lista consentita degli IP abilitata. Ensure che tutti gli IP Apigee NAT vengano aggiunti sul lato di destinazione interessato. In caso contrario, lista consentita nella destinazione, puoi saltare questa sezione.

Il problema è più facile da individuare se gli errori sono intermittenti, perché in questo caso potresti essere in grado di trovare una correlazione tra determinati IP NAT e gli errori.

Se il problema persiste (tutte le chiamate non vanno a buon fine), assicurati che Gli IP NAT sono abilitati su Apigee e recuperarli seguendo questi passaggi:

Elenca gli IP NAT per un'istanza:

curl -H "Authorization: Bearer $TOKEN" \
"https://apigee.googleapis.com/v1/organizations/$ORG_ID/instances/$INSTANCE_NAME/natAddresses"
Esempio di risposta:
{
  "natAddresses": [
    {
      "name": "nat-1",
      "ipAddress": "35.203.160.18",
      "state": "ACTIVE"
    },
    {
      "name": "nat-2",
      "ipAddress": "35.230.14.174",
      "state": "RESERVED"
    }
  ]
}
Se non ricevi indirizzi nell'output, gli IP NAT non vengono aggiunti sul lato Apigee. Se ricevi indirizzi, ma nessuno è ACTIVE, significa che nessuno degli indirizzi utilizzati consente l'accesso a internet, il che rappresenta un altro problema.

Se hai almeno un indirizzo ACTIVE, può essere inserito nella lista consentita nel target, pertanto non è presente alcuna configurazione errata lato Apigee. In questo caso, l'indirizzo potrebbe non essere presente nella lista consentita nel target.

Se il problema è intermittente, è possibile che solo un sottoinsieme di IP NAT sia stato inserito nella lista consentita nel target. Per identificarli:

  1. Creare un nuovo proxy inverso in cui la destinazione interessata è specificata in TargetEndpoint. Puoi anche riutilizzare il proxy esistente e passare al passaggio successivo:

    Crea proxy inverso
  2. Aggiungi un criterio ServiceCallout nel PreFlow della richiesta. ServiceCallout deve chiamare "https://icanhazip.com", "https://mocktarget.apigee.net/ip" o qualsiasi altro endpoint pubblico che restituisce l'indirizzo IP del chiamante nella risposta. Archivia la risposta nella "risposta" quindi affinché il contenuto sia visibile in Debug. Questo è un esempio di configurazione del criterio ServiceCallout:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout continueOnError="false" enabled="true" name="Service-Callout-1">
        <DisplayName>Service Callout-1</DisplayName>
        <Properties/>
        <Request clearPayload="true" variable="myRequest">
            <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
        </Request>
        <Response>response</Response>
        <HTTPTargetConnection>
            <Properties/>
            <URL>https://icanhazip.com</URL>
        </HTTPTargetConnection>
    </ServiceCallout>

    Puoi anche memorizzare la risposta in una variabile personalizzata, ma devi leggere il valore ".content" della variabile con il criterio AssignMessage per visualizzarla nello strumento di debug.

    Assicurati che la destinazione sia configurata nello stesso modo esatto del proxy interessato.

  3. Esegui una sessione di debug e fai clic sul passaggio ServiceCallout:

    Debug con ServiceCallout
  4. Nell'angolo in basso a destra, dovresti vedere una sezione Contenuti risposta che contiene l'IP NAT (nel corpo) dell'istanza Apigee che effettua la richiesta. In alternativa, se memorizzi la risposta ServiceCallout in una posizione diversa, dovresti vedere li contiene.

    Tieni presente che, più avanti nel flusso, il proxy chiamerà il target e il campo Risposta verranno sovrascritti con l'errore o una risposta del target.
  5. Prova a correlare gli IP NAT al problema. Se noti che solo determinati IP non vanno a buon fine, è un segno che alcuni, ma non tutti, gli IP sono inclusi nella lista consentita nel target.
  6. Se non vedi una correlazione tra gli IP NAT e gli errori, ad esempio se lo stesso indirizzo IP non riesce in una richiesta, ma non nell'altra, molto probabilmente non si tratta di un problema di inserimento nella lista consentita. Potrebbe trattarsi di un esaurimento del NAT. Vedi Causa: esaurimento della porta IP NAT.

Risoluzione

Assicurati di aver eseguito il provisioning e attivato gli IP NAT e che siano stati aggiunti tutti sul lato di destinazione.

Causa: esaurimento della porta IP NAT

Diagnosi

Se il problema è riproducibile solo da Apigee e il provisioning degli IP NAT è stato eseguito per la tua organizzazione e si verifica contemporaneamente per target diversi, potresti non avere più porte di origine NAT:

  1. Prendi nota del periodo di tempo in cui si è verificato il problema. Ad esempio: ogni giorno tra le 17:58 e le 18:08.
  2. Verifica se altre destinazioni sono interessate dal problema nello stesso lasso di tempo. L'altro target deve essere accessibile tramite internet e non deve essere ospitato nella stessa posizione del target interessato originale.
  3. Stabilisci se gli errori si verificano solo al di sopra di un determinato volume di traffico in TPS. Per farlo, prendi nota del periodo di tempo del problema e vai alla dashboard Rendimento proxy.
  4. Prova a correlare la finestra temporale dell'errore con l'aumento delle transazioni medie al secondo (tps).
Metriche delle API

In questo esempio, le ts/s aumentano a 1000 alle 17:58. Supponendo che in questo esempio le 17:58 siano esattamente nel momento in cui si verifica il problema e riguarda due o più obiettivi non correlati, segnale di un problema di esaurimento della funzionalità NAT.

Risoluzione

Ricalcola i requisiti IP NAT utilizzando le istruzioni in Calcolo dei requisiti IP NAT statici.

Puoi anche aggiungere altri IP NAT per vedere se il problema si risolve. Tieni presente che l'aggiunta di altri IP potrebbe richiedere l'inserimento nella lista consentita prima in tutti gli obiettivi.

Causa: il valore connect.timeout.millis è impostato su un valore troppo basso

Diagnosi

Il valore di timeout potrebbe essere configurato in modo errato nel proxy.

Per verificare, vai al proxy interessato e controlla il TargetEndpoint in questione. Tieni presente "connect.timeout.millisecondi" e il suo valore. In questo esempio il valore è 50, che è di 50 millisecondi e solitamente è troppo basso per garantire lo stabilire una connessione TCP. Se visualizza un valore inferiore a 1000, è probabile che sia la causa del problema. Se non vedi la proprietà "connect.timeout.millis", significa che è impostato il valore predefinito e la causa non è confermata.

Proxy con timeout

Risoluzione

Correggi il valore connect.timeout.millis, assicurandoti che le unità di tempo siano in millisecondi. Il valore predefinito è 3000, ovvero 3000 millisecondi. Per ulteriori informazioni, vedi consulta il riferimento per le proprietà degli endpoint.

Contatta l'assistenza per ulteriore supporto

Se il problema persiste dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni diagnostiche per l'assistenza Google Cloud:

  1. ID progetto e nome organizzazione Apigee
  2. Nomi dei proxy e ambiente
  3. Periodo di tempo del problema
  4. Frequenza del problema
  5. Nome host di destinazione
  6. Sessione di debug con il problema
  7. Risultato dei controlli eseguiti per le possibili cause sopra indicate. Ad esempio, l'output del comando curl da una VM