Soluciona problemas de publicación en App Engine

En esta página, se describen los errores comunes de inicialización y entrega de apps en App Engine, y los métodos para solucionarlos.

Error de permiso cuando se crea una app con la cuenta de servicio predeterminada

Cuando creas una app después de habilitar la API de App Engine por primera vez, es posible que falle con los siguientes errores:

gcloud CLI

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

Solicita registros.

Service account creation is not allowed on this project.

Console

Error while initialising App Engine.

Este error puede ocurrir debido a la aplicación de la restricción de la política de la organización constraints/iam.disableServiceAccountCreation cuando se crea tu app. Esta política evita el aprovisionamiento de la cuenta de servicio predeterminada de App Engine PROJECT_ID@appspot.gserviceaccount.com.

Para resolver este problema, debes quitar de forma temporal la restricción constraints/iam.disableServiceAccountCreation de la política de la 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 app 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 borrar o reemplazar por una cuenta de servicio que crees después de una implementación realizada de forma correcta.

Si usas una cuenta de servicio que creaste, revisa la Descripción general de las recomendaciones de roles para comprender cómo aplicar la restricción de permisos, como proporcionar una función de creador de tokens en la cuenta de servicio que creas para el agente de servicio.

La aplicación no publica los cambios de código más recientes.

Si tu aplicación no entrega los cambios de código más recientes después de la implementación, puedes usar el sistema de archivos raíz del contenedor para verificar el contenido. En los siguientes pasos para solucionar problemas, se muestra cómo recuperar la imagen del contenedor y exportar el sistema de archivos raíz para un análisis más detallado:

  1. 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 completamente calificado (FQDN). Por ejemplo, GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST.

  2. 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'
    

    Reemplaza lo siguiente:

    • FQDN por el nombre de dominio completamente calificado de la URL de la imagen del contenedor.
    • PROJECT_ID con el ID de tu Google Cloud proyecto.
    • SERVICE_NAME el nombre de tu servicio.
    • VERSION_ID por el ID de la versión del servicio.
    • SHA256_DIGEST con el valor SHA256
  3. Crea un contenedor nuevo con la URL de la imagen de 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`
    
  4. 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
    

    Como alternativa, si no necesitas el archivo TAR, ejecuta 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 cambios de código más recientes.

  5. 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 se puede conectar ni comunicar con el contenedor de la app

El siguiente error solo ocurre en el entorno flexible de App Engine y, por lo general, se muestra inmediatamente como error 502 después de que sucede:

recv() failed (104: Connection reset by peer) while reading response header from upstream

Este error indica que el proxy inverso de nginx (archivo adicional de nginx) no puede acceder al contenedor de la app. En los registros, puedes comparar el tiempo cercano del error 502 en el registro de nginx con el tiempo del registro de nginx.error. Es probable que un error nginx.error seguido inmediatamente de un error 502 de nginx sea la causa de este error.

Este error ocurre a menudo cuando el tiempo de espera de la conexión keepalive de la aplicación es menor que el tiempo de espera de keepalive de nginx. Como nginx en el entorno flexible de App Engine tiene keepalive_timeout de 650 segundos, las aplicaciones deben mantener las conexiones en funcionamiento durante al menos este tiempo. De forma predeterminada, las aplicaciones de Node.js tienen keepAliveTimeout de 5,000 milisegundos. En este caso, puedes establecer server.keepAliveTimeout en 700,000 milisegundos.

Para solucionar el problema, verifica los registros escritos por el código que se ejecuta en el contenedor de tu app mediante la conexión a la instancia de VM y agrega más registros, si es necesario, a fin de encontrar la causa raíz.

Memoria insuficiente

El siguiente error de falta de memoria ocurre en el entorno flexible de App Engine y, por lo general, se muestra con 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 cerró la aplicación.

Este error ocurre cuando la instancia no tiene memoria suficiente. De forma predeterminada, el entorno flexible de App Engine tiene 1 GB de memoria, con solo 600 MB disponibles para el contenedor de la aplicación.

Para solucionar el problema, verifica los registros en busca de una entrada de memoria insuficiente, actualiza la configuración de memory_gb en el archivo app.yaml y vuelve a implementarlo.

Conexiones abiertas insuficientes para manejar solicitudes entrantes

Las apps pueden encontrar un error 502 si la cantidad máxima de conexiones en espera es igual o mayor que el 75% de la cantidad de conexiones activas.

Para resolver el problema, verifica las Métricas de Cloud Monitoring para descubrir la cantidad máxima de conexiones activas y en espera, y disminuye la cantidad de conexiones en espera para garantizar que la cantidad máxima de conexiones en espera sea menor o igual que el 75% de la cantidad de conexiones activas.