Descripción general de la solución de problemas
En esta página, se proporciona información general sobre la solución de problemas para API Gateway.
No se pueden ejecutar los comandos "gcloud api-gateway"
Para ejecutar los comandos de gcloud api-gateway ..., debes haber actualizado
Google Cloud CLI y habilitado los servicios de Google necesarios.
Consulta Configura tu entorno de desarrollo para obtener más información.
El comando "gcloud api-gateway api-configs create" indica que la cuenta de servicio no existe
Si ejecutas el comando gcloud api-gateway api-configs create ... y recibes
un error con el siguiente formato:
ERROR: (gcloud.api-gateway.api-configs.create) FAILED_PRECONDITION: Service Account "projects/-/serviceAccounts/service_account_email" does not exist
Vuelve a ejecutar el comando, pero esta vez incluye la opción --backend-auth-service-account para
especificar de forma explícita la dirección de correo electrónico de la
cuenta de servicio que se usará:
gcloud api-gateway api-configs create CONFIG_ID \ --api=API_ID --openapi-spec=API_DEFINITION \ --backend-auth-service-account=SERVICE_ACCOUNT_EMAIL
Asegúrate de haber asignado los permisos necesarios a la cuenta de servicio, como se describe en Configura tu entorno de desarrollo.
Determina el origen de las respuestas de error de la API
Si las solicitudes a tu API implementada generan un error (códigos de estado HTTP
del 400 al 599), es posible que no quede claro en la
respuesta si el error se origina en la puerta de enlace o en tu backend.
Para determinarlo, sigue estos pasos:
Ve a la página Explorador de registros y selecciona tu proyecto.
Filtra el recurso de puerta de enlace relevante con la siguiente consulta de registro:
resource.type="apigateway.googleapis.com/Gateway" resource.labels.gateway_id="GATEWAY_ID" resource.labels.location="GCP_REGION"
Aquí:
- GATEWAY_ID especifica el nombre de la puerta de enlace.
- GCP_REGION es la región de Google Cloud para la puerta de enlace implementada.
Busca la entrada de registro que coincida con la respuesta de error de HTTP que quieres investigar. Por ejemplo, filtra por
httpRequest.status.Inspecciona el contenido del campo
jsonPayload.responseDetails.
Si el valor del campo jsonPayload.responseDetails es
"via_upstream", la respuesta de error se origina en tu
backend y deberás solucionar los problemas directamente en él. Si es cualquier otro valor, la respuesta de error se origina en la puerta de enlace. Consulta las siguientes secciones de este documento para obtener más sugerencias de solución de problemas.
La solicitud a la API devuelve un error HTTP 403
Si una solicitud a una API implementada devuelve un error de HTTP 403 al
cliente de API, significa que la URL solicitada es válida, pero el acceso está prohibido por algún
motivo.
Una API implementada tiene los permisos asociados con los roles otorgados a la
cuenta de servicio que
usaste cuando creaste la configuración de la API. Por lo general, el motivo del error de HTTP
403 es que la cuenta de servicio no tiene los permisos necesarios
para acceder al servicio de backend.
Si definiste la API y el servicio de backend en el mismo proyecto de Google Cloud,
asegúrate de que la cuenta de servicio tenga asignado el rol Editor
o el rol necesario para acceder al servicio de backend. Por ejemplo, si el servicio de backend
se implementa con Cloud Run Functions, asegúrate de que la cuenta de servicio
tenga asignado el rol Cloud Function Invoker.
La solicitud a la API devuelve un error HTTP 401 o 500
Si una solicitud a una API implementada devuelve un error HTTP 401 o
500 al cliente de API, es posible que haya un problema con la
cuenta de servicio que se usó cuando creaste la configuración de la API para llamar a tu servicio
de backend.
Una API implementada tiene los permisos asociados con los roles otorgados a la cuenta de servicio que usaste cuando creaste la configuración de la API. Se verifica la cuenta de servicio para asegurarse de que exista y de que la puerta de enlace de la API pueda usarla cuando se implemente la API.
Si la cuenta de servicio se borra o inhabilita después de implementar la puerta de enlace, puede ocurrir la siguiente secuencia de eventos:
Inmediatamente después de que se borre o inhabilite la cuenta de servicio, es posible que veas respuestas HTTP 401 en los registros de la puerta de enlace. Si el campo
jsonPayload.responseDetailsse establece en"via_upstream"en eljsonPayloadde la entrada de registro, esto indica que borrar o inhabilitar la cuenta de servicio es la causa del error.También es posible que veas un error de HTTP
500sin ninguna entrada de registro correspondiente en los registros de API Gateway. Si no hay solicitudes a tu puerta de enlace inmediatamente después de que se borra o inhabilita la cuenta de servicio, es posible que no veas las respuestas HTTP 401, pero los errores HTTP500sin los registros de la puerta de enlace de la API correspondientes indican que la cuenta de servicio de la puerta de enlace ya no está activa.
Si el backend de la solicitud con errores es otra API de Google Cloud (como bigquery.googleapis.com), verás respuestas HTTP 401 en los registros de la puerta de enlace
con el campo jsonPayload.responseDetails establecido en "via_upstream". Esto se debe a que
API Gateway se autentica en los backends con un
token de ID, mientras que
otras APIs de Google Cloud requieren un
token de acceso.
La solicitud a la API devuelve un error HTTP 500 para un método con aplicación de cuota
Si recibes el siguiente error, la puerta de enlace no pudo asignar la cuota para tu solicitud:
HTTP/2 500 {"code":500,"message":"Failed to call Service Control Quota."}
Este error suele ocurrir cuando llamas a un método que tiene una
cuota configurada, pero las métricas de cuota ya no existen para
la API. En una puerta de enlace de gRPC, se muestra el mismo error que el código de estado de gRPC
Internal.
Confirma la causa en los registros de la puerta de enlace
Ve a la página Explorador de registros y selecciona tu proyecto.
Ejecuta la siguiente consulta de registro:
resource.type="apigateway.googleapis.com/Gateway" resource.labels.gateway_id="GATEWAY_ID" jsonPayload.responseDetails="service_control_quota_error" httpRequest.status=500
En el ejemplo anterior, GATEWAY_ID especifica el nombre de la puerta de enlace.
La consulta filtra por el código de estado y por
jsonPayload.responseDetails, ya que API Gateway usa el mismo valorresponseDetailspara cada rechazo de cuota. Una solicitud que superó legítimamente su cuota produce el mismo valor con unhttpRequest.statusde429.Inspecciona los campos
jsonPayload.apiConfigyjsonPayload.apiMethodde cualquier entrada coincidente. Identifican la configuración de la API y el método cuya configuración de cuota no es válida.
Por qué una configuración de API puede tener una configuración de cuota no válida
Las métricas y los límites de cuota se definen en una configuración de API, pero API Gateway los aplica a toda la API. Cada vez que creas una configuración de API, las métricas y los límites que declara reemplazan los que se declararon en las configuraciones de API anteriores de la API. Solo se aplican los valores de la configuración de la API creada más recientemente.
En cambio, las métricas que consume cada método se definen en la configuración de la API que entrega la puerta de enlace. Si una puerta de enlace ejecuta una configuración de API más antigua, le pide a Control de servicios que asigne una cuota de asignación en función de una métrica que existe en su propia configuración, pero que podría no existir en la API. Si la métrica no existe, la llamada de asignación falla y la puerta de enlace rechaza la solicitud.
Por ejemplo, la siguiente secuencia deja la primera puerta de enlace rota:
- Creas la configuración de la API
config-v1, que declara la métricaquota-metric-v1, y la implementas engateway-1. - Creas la configuración de API
config-v2para la misma API, que declara la métricaquota-metric-v2, y la implementas engateway-2.
gateway-2 funciona, pero las solicitudes a los métodos de gateway-1 que aplican cuotas
comienzan a fallar, porque quota-metric-v1 ya no está definido para la API.
Los siguientes cambios pueden causar errores en cualquier puerta de enlace que aún esté implementada con una configuración de API anterior:
- Cambiar el nombre de una métrica o quitarla
- Cambiar la métrica a la que se aplica un límite de cuota
- Cambiar la métrica nombrada en los costos de cuota por método
(
x-google-quotapara documentos de OpenAPI oquota.metric_rulespara parámetros de configuración del servicio de gRPC).
Cambiar solo el valor de un límite no genera errores. Sin embargo, debido a que los límites también se aplican a nivel de API, el valor nuevo se aplica en cada puerta de enlace de esa API, incluidas las puertas de enlace implementadas con una configuración de API anterior.
Compara las configuraciones de cuota implementadas
Enumera tus puertas de enlace y la configuración de la API que entrega cada una:
gcloud api-gateway gateways list \ --format="table(name.basename(),apiConfig)"
Enumera los parámetros de configuración de la API afectada, primero los creados más recientemente:
gcloud api-gateway api-configs list --api=API_ID \ --format="table(name.basename(),createTime:sort=1:reverse)"
La primera entrada es la configuración de la API cuyas métricas y límites de cuota se aplican a toda la API. Ordena con la marca
--formatcomo se muestra: este comando no admite la marca--sort-byy no devuelve las configuraciones de la API en un orden predecible.Muestra la definición de la API a partir de la que se creó una configuración de API:
gcloud api-gateway api-configs describe CONFIG_ID --api=API_ID \ --view=FULL --format="value(openapiDocuments[0].document.contents)" \ | tr '_-' '/+' | base64 --decode
El comando
tres obligatorio porque el campocontentsestá codificado en base64url, quebase64 --decodeno puede leer directamente.Para una API de gRPC, la configuración de la cuota se encuentra en la configuración del servicio, no en un documento de OpenAPI, por lo que debes reemplazar
openapiDocuments[0].document.contentspormanagedServiceConfigs[0].contents.Ejecuta el comando del paso 3 para la configuración de la API que se encuentra en la parte superior de la lista del paso 2 y, luego, para cada uno de los otros parámetros de configuración de la API que se muestran en el paso 1 como implementados en una puerta de enlace.
Compara los resultados. Cada métrica que una configuración de API anterior cobra por sus métodos también debe definirse en la configuración de API creada más recientemente. Si falta una métrica en esa configuración, fallarán las puertas de enlace que entregan la configuración de la API anterior.
Restablece una configuración de cuota válida
Audita tus métricas y límites de cuota para asegurarte de que sean coherentes en todas las configuraciones activas. Para ello, realiza una de las siguientes acciones:
- Actualiza cada puerta de enlace de la API para usar la configuración de API creada más recientemente, como se describe en Actualiza una puerta de enlace.
- Crea una configuración de API nueva que declare cada métrica que usen las configuraciones de API que aún se implementan y mantén las puertas de enlace existentes en sus configuraciones de API actuales.
Para evitar errores de asignación, mantén la coherencia de los nombres de las métricas en los parámetros de configuración de la API. Cuando cambies una cuota, cambia el valor del límite en lugar del nombre de la métrica.
Solicitudes a la API con alta latencia
Al igual que Cloud Run y Cloud Run Functions, API Gateway está sujeto a la latencia de "inicio en frío". Si tu puerta de enlace no recibió tráfico durante 15 a 20 minutos, las solicitudes realizadas a tu puerta de enlace dentro de los primeros 10 a 15 segundos del inicio en frío experimentarán de 3 a 5 segundos de latencia.
Si el problema persiste después del período inicial de "calentamiento", verifica los registros de solicitudes de los servicios de backend que configuraste en tu configuración de la API. Por ejemplo, si el servicio de backend se implementa con Cloud Run Functions, verifica las entradas de registro de Cloud Logging del registro de solicitudes de Cloud Function asociado.
No se puede ver la información de los registros
Si tu API responde correctamente, pero los registros no contienen datos, por lo general, eso significa que no habilitaste todos los servicios de Google que requiere API Gateway.
API Gateway requiere que habilites los siguientes servicios de Google Cloud :
| Nombre | Nombre del servicio |
|---|---|
| API de API Gateway | apigateway.googleapis.com |
| API de Service Management | servicemanagement.googleapis.com |
| API de Service Control | servicecontrol.googleapis.com |
Para habilitar los servicios obligatorios, sigue estos pasos:
Consola de Google Cloud
En la consola de Google Cloud , ve a la página APIs y servicios > Biblioteca de APIs.
- En la página Biblioteca de APIs, ingresa el nombre de la API requerida en la barra de búsqueda.
- En los resultados de la búsqueda, selecciona la página de la API.
- En la página de la API, haz clic en Habilitar.
- Repite estos pasos para cada uno de los servicios que se indican en la tabla anterior.
Google Cloud CLI
Usa los siguientes comandos para habilitar los servicios:
gcloud services enable apigateway.googleapis.comgcloud services enable servicemanagement.googleapis.comgcloud services enable servicecontrol.googleapis.com
Para obtener más información sobre los servicios de gcloud, consulta Servicios de gcloud.