Panoramica della risoluzione dei problemi
Questa pagina fornisce informazioni generali per la risoluzione dei problemi relativi ad API Gateway.
Impossibile eseguire i comandi "gcloud api-gateway"
Per eseguire i comandi gcloud api-gateway ..., devi aver aggiornato
Google Cloud CLI e abilitato i servizi Google necessari.
Per saperne di più, consulta Configurare l'ambiente di sviluppo.
Il comando "gcloud api-gateway api-configs create" indica che account di servizio non esiste
Se esegui il comando gcloud api-gateway api-configs create ... e ricevi un errore nel formato:
ERROR: (gcloud.api-gateway.api-configs.create) FAILED_PRECONDITION: Service Account "projects/-/serviceAccounts/service_account_email" does not exist
Esegui di nuovo il comando, ma questa volta includi l'opzione --backend-auth-service-account per
specificare in modo esplicito l'indirizzo email del
service account da utilizzare:
gcloud api-gateway api-configs create CONFIG_ID \ --api=API_ID --openapi-spec=API_DEFINITION \ --backend-auth-service-account=SERVICE_ACCOUNT_EMAIL
Assicurati di aver già assegnato le autorizzazioni necessarie al account di servizio come descritto in Configurare l'ambiente di sviluppo.
Determinare l'origine delle risposte di errore dell'API
Se le richieste all'API di cui hai eseguito il deployment generano un errore (codici di stato HTTP da 400 a 599), la risposta stessa potrebbe non indicare chiaramente se l'errore proviene dal gateway o dal backend.
Per determinarlo:
Vai alla pagina Esplora log e seleziona il tuo progetto.
Filtra la risorsa gateway pertinente utilizzando la seguente query di log:
resource.type="apigateway.googleapis.com/Gateway" resource.labels.gateway_id="GATEWAY_ID" resource.labels.location="GCP_REGION"
Dove:
- GATEWAY_ID specifica il nome del gateway.
- GCP_REGION è la Google Cloud regione del gateway di cui è stato eseguito il deployment.
Trova la voce di log che corrisponde alla risposta di errore HTTP che vuoi esaminare. Ad esempio, filtra per
httpRequest.status.Esamina i contenuti del campo
jsonPayload.responseDetails.
Se il valore del campo jsonPayload.responseDetails è
"via_upstream", la risposta di errore proviene dal
backend e dovrai risolvere i problemi direttamente nel backend. Se è un altro valore, la risposta di errore proviene dal gateway. Per ulteriori suggerimenti per la risoluzione dei problemi, consulta le sezioni seguenti di questo documento.
La richiesta API restituisce un errore HTTP 403
Se una richiesta a un'API di cui è stato eseguito il deployment restituisce un errore HTTP 403 al client API, significa che l'URL richiesto è valido, ma l'accesso è vietato per qualche motivo.
Un'API di cui è stato eseguito il deployment ha le autorizzazioni associate ai ruoli concessi al
service account che hai
utilizzato quando hai creato la configurazione API. In genere, il motivo dell'errore HTTP 403 è che il account di servizio non dispone delle autorizzazioni necessarie per accedere al servizio di backend.
Se hai definito l'API e il servizio di backend nello stesso progetto Google Cloud, assicurati che al account di servizio sia assegnato il ruolo Editor o il ruolo necessario per accedere al servizio di backend. Ad esempio, se il servizio di backend
è implementato utilizzando Cloud Run Functions, assicurati che al account di servizio
sia assegnato il ruolo Cloud Function Invoker.
La richiesta API restituisce un errore HTTP 401 o 500
Se una richiesta a un'API di cui è stato eseguito il deployment restituisce un errore HTTP 401 o 500 al client API, potrebbe esserci un problema con l'utilizzo del account di servizio utilizzato quando hai creato la configurazione API per chiamare il servizio di backend.
Un'API di cui è stato eseguito il deployment ha le autorizzazioni associate ai ruoli concessi al service account che hai utilizzato quando hai creato la configurazione API. Il account di servizio viene controllato per assicurarsi che esista e che possa essere utilizzato dal gateway API quando viene eseguito il deployment dell'API.
Se il account di servizio viene eliminato o disattivato dopo il deployment del gateway, potrebbe verificarsi la seguente sequenza di eventi:
Subito dopo l'eliminazione o la disattivazione del account di servizio, potresti visualizzare risposte HTTP 401 nei log del gateway. Se il campo
jsonPayload.responseDetailsè impostato su"via_upstream"injsonPayloaddella voce di log, significa che l'eliminazione o la disattivazione del account di servizio è la causa dell'errore.Potresti anche visualizzare un errore HTTP
500senza alcuna voce di log corrispondente nei log di API Gateway. Se non ci sono richieste al gateway subito dopo l'eliminazione o la disattivazione del account di servizio, potresti non visualizzare le risposte HTTP 401, ma gli errori HTTP500senza i log di API Gateway corrispondenti indicano che il account di servizio del gateway potrebbe non essere più attivo.
Se il backend della richiesta non riuscita è un'altra Google Cloud API (ad esempio bigquery.googleapis.com), nei log del gateway verranno visualizzate risposte HTTP 401
con il campo jsonPayload.responseDetails impostato su "via_upstream". Questo perché
API Gateway esegue l'autenticazione ai backend con un
token ID mentre
altre Google Cloud API richiedono un
token di accesso.
La richiesta API restituisce un errore HTTP 500 per un metodo con quota applicata
Se ricevi il seguente errore, il gateway non è riuscito ad allocare la quota per la tua richiesta:
HTTP/2 500 {"code":500,"message":"Failed to call Service Control Quota."}
Questo errore si verifica in genere quando chiami un metodo per il quale è configurata una
quota, ma le metriche relative alle quote non esistono più per
l'API. Su un gateway gRPC, lo stesso errore viene restituito come codice di stato gRPC Internal.
Confermare la causa nei log del gateway
Vai alla pagina Esplora log e seleziona il tuo progetto.
Esegui la seguente query di log:
resource.type="apigateway.googleapis.com/Gateway" resource.labels.gateway_id="GATEWAY_ID" jsonPayload.responseDetails="service_control_quota_error" httpRequest.status=500
Dove GATEWAY_ID specifica il nome del gateway.
La query filtra in base al codice di stato e a
jsonPayload.responseDetailsperché API Gateway utilizza lo stessoresponseDetailsvalore per ogni rifiuto della quota. Una richiesta che ha superato legittimamente la quota produce lo stesso valore con unhttpRequest.statusdi429.Esamina i campi
jsonPayload.apiConfigejsonPayload.apiMethoddi qualsiasi voce corrispondente. Identificano la configurazione API e il metodo la cui configurazione della quota non è valida.
Perché una configurazione API può avere una configurazione della quota non valida
Definisci le metriche e i limiti delle quote in una configurazione API, ma API Gateway li applica all'intera API. Ogni volta che crei una configurazione API, le metriche e i limiti che dichiara sostituiscono quelli dichiarati dalle configurazioni API precedenti dell'API. Vengono applicati solo i valori della configurazione API creata più di recente.
Al contrario, le metriche utilizzate da ogni metodo sono definite nella configurazione API che il gateway pubblica. Se un gateway esegue una configurazione API precedente, chiede a Service Control di allocare la quota in base a una metrica che esiste nella sua configurazione, ma potrebbe non esistere nell'API. Se la metrica non esiste, la chiamata di allocazione non riesce e il gateway rifiuta la richiesta.
Ad esempio, la seguente sequenza lascia il primo gateway interrotto:
- Crei la configurazione API
config-v1, che dichiara la metricaquota-metric-v1, ed esegui il deployment ingateway-1. - Crei la configurazione API
config-v2per la stessa API, che dichiara la metricaquota-metric-v2, ed esegui il deployment ingateway-2.
gateway-2 funziona, ma le richieste ai metodi con quota applicata di gateway-1 iniziano a non riuscire perché quota-metric-v1 non è più definita per l'API.
Le seguenti modifiche possono causare errori per qualsiasi gateway di cui è ancora stato eseguito il deployment con una configurazione API precedente:
- Rinominare o rimuovere una metrica.
- Modificare la metrica a cui si applica un limite di quota.
- Modificare la metrica denominata nei costi della quota per metodo (
x-google-quotaper i documenti OpenAPI oquota.metric_rulesper le configurazioni del servizio gRPC).
La modifica del solo valore di un limite non causa errori. Tuttavia, poiché i limiti vengono applicati anche a livello API, il nuovo valore viene applicato a ogni gateway di quell'API, inclusi i gateway di cui è stato eseguito il deployment con una configurazione API precedente.
Confrontare le configurazioni delle quote di cui è stato eseguito il deployment
Elenca i gateway e la configurazione API che ogni gateway pubblica:
gcloud api-gateway gateways list \ --format="table(name.basename(),apiConfig)"
Elenca le configurazioni API dell'API interessata, a partire da quella creata più di recente:
gcloud api-gateway api-configs list --api=API_ID \ --format="table(name.basename(),createTime:sort=1:reverse)"
La prima voce è la configurazione API le cui metriche e i cui limiti delle quote vengono applicati all'intera API. Ordina con il flag
--formatcome mostrato: questo comando non supporta il flag--sort-bye non restituisce le configurazioni API in un ordine prevedibile.Visualizza la definizione dell'API da cui è stata creata una configurazione API:
gcloud api-gateway api-configs describe CONFIG_ID --api=API_ID \ --view=FULL --format="value(openapiDocuments[0].document.contents)" \ | tr '_-' '/+' | base64 --decode
Il comando
trè obbligatorio perché il campocontentsè codificato in base64url, chebase64 --decodenon può leggere direttamente.Per un'API gRPC, la configurazione della quota si trova nella configurazione del servizio anziché in un documento OpenAPI, quindi sostituisci
openapiDocuments[0].document.contentsconmanagedServiceConfigs[0].contents.Esegui il comando nel passaggio 3 per la configurazione API nella parte superiore dell'elenco del passaggio 2 e poi per ciascuna delle altre configurazioni API che il passaggio 1 mostra come ancora di cui è stato eseguito il deployment in un gateway.
Confronta i risultati. Ogni metrica per cui una configurazione API precedente addebita i metodi deve essere definita anche nella configurazione API creata più di recente. Se una metrica non è presente in questa configurazione, i gateway che pubblicano la configurazione API precedente non funzionano.
Ripristinare una configurazione della quota valida
Esegui un audit delle metriche e dei limiti delle quote per assicurarti che siano coerenti in tutte le configurazioni attive. Per farlo, esegui una delle seguenti azioni:
- Aggiorna ogni gateway dell'API in modo che utilizzi la configurazione API creata più di recente, come descritto in Aggiornare un gateway.
- Crea una nuova configurazione API che dichiari ogni metrica utilizzata dalle configurazioni API di cui è ancora stato eseguito il deployment e mantieni i gateway esistenti nelle configurazioni API correnti.
Per evitare errori di allocazione, mantieni i nomi delle metriche coerenti nelle configurazioni API di un'API. Quando modifichi una quota, modifica il valore del limite anziché il nome della metrica.
Richieste API a latenza elevata
Come Cloud Run e Cloud Run Functions, API Gateway è soggetto alla latenza di "avvio a freddo". Se il gateway non ha ricevuto traffico per 15-20 minuti, le richieste effettuate al gateway nei primi 10-15 secondi dell'avvio a freddo subiranno una latenza di 3-5 secondi.
Se il problema persiste dopo il periodo di "riscaldamento" iniziale, controlla i log delle richieste dei servizio di backend configurati nella configurazione API. Ad esempio, se il servizio di backend è implementato utilizzando Cloud Run Functions, controlla le voci di Cloud Logging del log delle richieste di Cloud Function associato.
Impossibile visualizzare le informazioni di log
Se l'API risponde correttamente, ma i log non contengono dati, in genere significa che non hai abilitato tutti i servizi Google richiesti da API Gateway.
API Gateway richiede l'abilitazione dei seguenti Google Cloud servizi:
| Nome | Nome servizio |
|---|---|
| API API Gateway | apigateway.googleapis.com |
| API Service Management | servicemanagement.googleapis.com |
| API Service Control | servicecontrol.googleapis.com |
Per abilitare i servizi richiesti:
Google Cloud Console
Nella Google Cloud console, vai alla pagina API e servizi > Libreria API.
- Nella pagina Libreria API, inserisci il nome dell'API richiesta nella barra di ricerca.
- Nei risultati di ricerca, seleziona la pagina dell'API.
- Nella pagina dell'API, fai clic su Abilita.
- Ripeti questi passaggi per ciascuno dei servizi elencati nella tabella precedente.
Google Cloud CLI
Utilizza i seguenti comandi per abilitare i servizi:
gcloud services enable apigateway.googleapis.comgcloud services enable servicemanagement.googleapis.comgcloud services enable servicecontrol.googleapis.com
Per ulteriori informazioni sui servizi gcloud, consulta
gcloud servizi.