Risolvere i problemi di pubblicazione in App Engine

Questa pagina descrive gli errori comuni di inizializzazione e pubblicazione delle app in App Engine e i metodi per risolverli.

Errore di autorizzazione durante la creazione di un'app con il account di servizio predefinito

Quando crei un'app dopo aver abilitato l'API App Engine per la prima volta, la creazione potrebbe non riuscire e potresti visualizzare i seguenti errori:

Interfaccia a riga di comando 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

Richiedere log

Service account creation is not allowed on this project.

Console

Error while initialising App Engine.

Questo errore potrebbe verificarsi a causa dell'applicazione del vincolo del criterio dell'organizzazione constraints/iam.disableServiceAccountCreation durante la creazione dell'app. Questo criterio impedisce il provisioning del service account predefinito di App Engine PROJECT_ID@appspot.gserviceaccount.com.

Per risolvere il problema, devi rimuovere temporaneamente il vincolo della policy dell'organizzazione constraints/iam.disableServiceAccountCreation per consentire la creazione e il deployment deaccount di serviziont predefinito di App Engine. Il account di servizio predefinito è necessario per la creazione dell'app e non può essere ignorato. Ciò vale anche quando utilizzi un account di servizio per versione. Il account di servizio predefinito di App Engine può essere eliminato o sostituito con unaccount di serviziot creato dopo il deployment riuscito.

Se utilizzi un account di servizio che hai creato, consulta la Panoramica dei suggerimenti per i ruoli per capire come applicare le autorizzazioni restrittive, ad esempio fornendo un ruolo di creatore di token sul account di servizio che crei per l'agente di servizio.

L'applicazione non pubblica le modifiche più recenti al codice

Se la tua applicazione non pubblica le ultime modifiche al codice dopo il deployment, puoi utilizzare il file system root del container per controllare i contenuti. I seguenti passaggi per la risoluzione dei problemi mostrano come recuperare l'immagine container ed esportare il file system root per ulteriori analisi:

  1. Utilizza Cloud Logging per ottenere l'URL dell'immagine container, con il filtro GAE_FULL_APP_CONTAINER. Dopo aver applicato il filtro, Cloud Logging mostra l'URL dell'immagine container con il tuo nome di dominio completo (FQDN). Ad esempio GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST.

  2. Esegui questo comando per esportare l'URL dell'immagine container:

    export IMAGE_URL='FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST'
    

    Sostituisci:

    • FQDN con il nome di dominio completo dell'URL dell'immagine container.
    • PROJECT_ID con l'ID progetto del tuo progetto Google Cloud .
    • SERVICE_NAME con il nome del servizio.
    • VERSION_ID con l'ID versione del servizio.
    • SHA256_DIGEST con il valore SHA256.
  3. Crea un nuovo container con l'URL dell'immagine container:

    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. Esporta il file system root (rootfs) dell'immagine container:

     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
    

    In alternativa, se non hai bisogno del file TAR, esegui questo comando:

      mkdir gae_app
      cd gae_app/
      docker export ${CONTAINER_ID} | tar -xC <dest>
      ls -la # inspect the container FS
    

    Analizza i contenuti del file system root per verificare se sono presenti le modifiche più recenti al codice.

  5. Esegui questo comando per pulire l'immagine:

    docker container rm ${CONTAINER_ID}
    docker image rm ${IMAGE_URL}
    unset IMAGE_URL CONTAINER_ID
    

Nginx non riesce a connettersi o a contattare il container dell'app

Il seguente errore si verifica solo nell'ambiente flessibile App Engine e in genere viene restituito con errori 502 immediatamente dopo l'errore:

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

Questo errore indica che il proxy inverso nginx (nginx sidecar) non riesce a raggiungere il container dell'app. Nei log, puoi confrontare la tempistica di chiusura dell'errore 502 nel log nginx con la tempistica del log nginx.error. Un errore nginx.error seguito immediatamente da un errore nginx 502 è probabilmente la causa dell'errore nginx 502.

Questo errore si verifica spesso quando il timeout keepalive della applicazione è inferiore al timeout keepalive di Nginx. Poiché nginx nell'ambiente flessibile di App Engine ha un keepalive_timeout di 650 secondi, le applicazioni devono mantenere attive le connessioni per almeno questo periodo di tempo. Per impostazione predefinita, le applicazioni Node.js hanno keepAliveTimeout di 5000 millisecondi. In questo caso, puoi impostare server.keepAliveTimeout su 700.000 millisecondi.

Per risolvere il problema, controlla i log scritti dal codice in esecuzione nel container dell'app connettendoti all'istanza VM e aggiungi altri log, se necessario, per trovare la causa principale.

Memoria insufficiente

Il seguente errore di esaurimento della memoria si verifica nell'ambiente flessibile App Engine e in genere restituisce errori 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

Questo errore indica che App Engine ha terminato l'applicazione.

Questo errore si verifica quando l'istanza non ha memoria sufficiente. Per impostazione predefinita, l'ambiente flessibile App Engine ha 1 GB di memoria, di cui solo 600 MB disponibili per il container dell'applicazione.

Per risolvere il problema, controlla i log per una voce relativa a memoria insufficiente, aggiorna la configurazione di memory_gb nel file app.yaml ed esegui di nuovo il deployment.

Connessioni aperte insufficienti per gestire le richieste in entrata

Le app potrebbero riscontrare un errore 502 se il numero massimo di connessioni in attesa è uguale o superiore al 75% del numero di connessioni attive.

Per risolvere il problema, controlla le metriche di Cloud Monitoring per il numero massimo di connessioni attive e in attesa e riduci il numero di connessioni in attesa per assicurarti che il numero massimo di connessioni in attesa sia inferiore o uguale al 75% del numero di connessioni attive.