En esta página se describen los errores habituales de inicialización y publicación de aplicaciones en App Engine, así como los métodos para solucionarlos.
Error de permisos al crear una aplicación con la cuenta de servicio predeterminada
Cuando creas una aplicación después de habilitar la API de App Engine por primera vez, es posible que se produzcan los siguientes errores:
CLI de gcloud
An internal error occurred while calling service consumer manager for service account.
Creating App Engine application in projectPROJECT and REGION....failed. DEBUG: (gcloud.app.create) Error Response: [13] an internal error has occurred
Registros de solicitudes
Service account creation is not allowed on this project.
Consola
Error while initialising App Engine.
Este error puede producirse debido a la aplicación de la restricción de la política de organización constraints/iam.disableServiceAccountCreation
al crear tu aplicación. Esta política impide el aprovisionamiento de la cuenta de servicio predeterminada de App Engine PROJECT_ID@appspot.gserviceaccount.com
.
Para solucionar este problema, debes quitar temporalmente la restricción constraints/iam.disableServiceAccountCreation
de la política de organización para permitir la creación y la implementación de la cuenta de servicio predeterminada de App Engine. La cuenta de servicio predeterminada es necesaria para crear la aplicación y no se puede omitir. Esto también se aplica cuando usas una cuenta de servicio por versión.
La cuenta de servicio predeterminada de App Engine se puede eliminar o sustituir por una cuenta de servicio que crees después de completar la implementación.
Si usas una cuenta de servicio que has creado, consulta el resumen de las recomendaciones de roles para saber cómo restringir los permisos, como asignar el rol de creador de tokens a la cuenta de servicio que crees para el agente de servicio.
La aplicación no está usando los últimos cambios en el código
Si tu aplicación no está usando los últimos cambios de código después de la implementación, puedes usar el sistema de archivos raíz del contenedor para comprobar el contenido. En los siguientes pasos para solucionar problemas se muestra cómo obtener la imagen del contenedor y exportar el sistema de archivos raíz para analizarlo más a fondo:
Usa Cloud Logging para obtener la URL de la imagen del contenedor con el filtro
GAE_FULL_APP_CONTAINER
. Después de aplicar el filtro, Cloud Logging muestra la URL de la imagen del contenedor con tu nombre de dominio completo (FQDN). Por ejemplo,GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST
.Ejecuta el siguiente comando para exportar la URL de la imagen del contenedor:
export IMAGE_URL='FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST'
Sustituye:
- FQDN con el nombre de dominio completo de la URL de la imagen del contenedor.
- PROJECT_ID por el ID del proyecto de Google Cloud .
- SERVICE_NAME por el nombre de tu servicio.
- VERSION_ID con el ID de versión del servicio.
- SHA256_DIGEST con el valor SHA256.
Crea un contenedor con la URL de la imagen del contenedor:
docker pull ${IMAGE_URL} export CONTAINER_ID=$(docker create ${IMAGE_URL}) docker ps -a # the list should contain the newly created container with status `Created`
Exporta el sistema de archivos raíz (
rootfs
) de la imagen del contenedor:docker export ${CONTAINER_ID} -o gae_app.tar mkdir gae_app mv -v gae_app.tar gae_app/ cd gae_app/ tar -xf gae_app.tar ls -la # inspect the container FS
Si no necesitas el archivo
TAR
, puedes ejecutar el siguiente comando:mkdir gae_app cd gae_app/ docker export ${CONTAINER_ID} | tar -xC <dest> ls -la # inspect the container FS
Analiza el contenido del sistema de archivos raíz para verificar si están presentes los últimos cambios de código.
Ejecuta el siguiente comando para limpiar la imagen:
docker container rm ${CONTAINER_ID} docker image rm ${IMAGE_URL} unset IMAGE_URL CONTAINER_ID
Nginx no puede conectarse ni ponerse en contacto con el contenedor de la aplicación
El siguiente error solo se produce en el entorno flexible de App Engine y suele devolver errores 502 inmediatamente después del error:
recv() failed (104: Connection reset by peer) while reading response header from upstream
Este error indica que el proxy inverso de nginx (sidecar de nginx) no puede acceder al contenedor de la aplicación. En los registros, puedes comparar el tiempo de cierre del error 502 en el registro de nginx con el tiempo del registro nginx.error. Es probable que un error de nginx 502 se deba a un error de nginx.error seguido inmediatamente de un error de nginx 502.
Este error suele producirse cuando el tiempo de espera de keepalive de la conexión de la aplicación es inferior al tiempo de espera de keepalive de nginx. Como nginx en el entorno flexible de App Engine tiene un keepalive_timeout
de 650 segundos, las aplicaciones deben mantener las conexiones activas durante al menos ese tiempo. De forma predeterminada, las aplicaciones de Node.js tienen un keepAliveTimeout
de 5000 milisegundos. En este caso, puedes definir server.keepAliveTimeout
en 700.000 milisegundos.
Para solucionar el problema, consulta los registros escritos por el código que se ejecuta en el contenedor de tu aplicación conectándote a la instancia de VM y añade más registros, si es necesario, para encontrar la causa principal.
Memoria insuficiente
El siguiente error de memoria insuficiente se produce en el entorno flexible de App Engine y suele devolver errores 502:
kernel: [ 133.706951] Out of memory: Kill process 4490 (java) score 878 or sacrifice child
kernel: [ 133.714468] Killed process 4306 (java) total-vm:5332376kB, anon-rss:2712108kB, file-rss:0kB
Este error indica que App Engine ha finalizado la aplicación.
Este error se produce cuando la instancia no tiene suficiente memoria. De forma predeterminada, el entorno flexible de App Engine tiene 1 GB de memoria, de los cuales solo 600 MB están disponibles para el contenedor de la aplicación.
Para solucionar el problema, comprueba si hay una entrada de falta de memoria en los registros, actualiza la configuración de memory_gb
en el archivo app.yaml
y vuelve a implementar.
No hay suficientes conexiones abiertas para gestionar las solicitudes entrantes
Las aplicaciones pueden recibir un error 502 si el número máximo de conexiones en espera es igual o superior al 75% del número de conexiones activas.
Para solucionar el problema, consulta las métricas de Cloud Monitoring del número máximo de conexiones activas y en espera, y reduce el número de conexiones en espera para asegurarte de que el número máximo de conexiones en espera sea inferior o igual al 75% del número de conexiones activas.