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 service account predefinito
Quando crei un'app dopo aver attivato l'API App Engine per la prima volta, la creazione potrebbe non andare a buon fine con 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 della norma dell'organizzazione constraints/iam.disableServiceAccountCreation
durante la creazione dell'app. Questa norma impedisce il provisioning del service account predefinito di App Engine PROJECT_ID@appspot.gserviceaccount.com
.
Per risolvere il problema, devi rimuovere temporaneamente il vincolo constraints/iam.disableServiceAccountCreation
delle norme dell'organizzazione per consentire la creazione e il deployment del service account predefinito di App Engine. L'account di servizio predefinito è necessario per la creazione dell'app e non può essere ignorato. Questo vale anche quando utilizzi un account di servizio per versione.
L'account di servizio predefinito di App Engine può essere eliminato o sostituito
con un account di servizio creato dopo il deployment riuscito.
Se utilizzi un account di servizio che hai creato, consulta la Panoramica dei consigli sui ruoli per capire come applicare le autorizzazioni limitate, ad esempio fornire un ruolo di creatore token all'account di servizio che crei per l'agente di servizio.
L'applicazione non pubblica le modifiche al codice più recenti
Se l'applicazione non pubblica le modifiche al codice più recenti dopo il deployment, puoi utilizzare il file system principale del contenitore per controllare i contenuti. I seguenti passaggi per la risoluzione dei problemi mostrano come recuperare l'immagine del contenitore ed esportare il sistema di file principale per ulteriori analisi:
Utilizza Cloud Logging per ottenere l'URL dell'immagine container con il filtro
GAE_FULL_APP_CONTAINER
. Dopo aver applicato il filtro, Cloud Logging visualizza l'URL dell'immagine del contenitore con il nome di dominio completo (FQDN). Ad esempio,GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST
.Esegui il comando seguente per esportare l'URL dell'immagine del contenitore:
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 del container.
- PROJECT_ID con l'ID progetto del tuo Google Cloud progetto.
- SERVICE_NAME con il nome del servizio.
- VERSION_ID con l'ID versione del servizio.
- SHA256_DIGEST con il valore SHA256.
Crea un nuovo contenitore con l'URL dell'immagine del contenitore:
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`
Esporta il file system principale (
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 il seguente 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 principale per verificare se sono presenti le modifiche al codice più recenti.
Esegui il comando seguente per ripulire 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 contenitore dell'app
Il seguente errore si verifica solo nell'ambiente flessibile di 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 è in grado di raggiungere il contenitore dell'app. Nei log, puoi confrontare il momento di chiusura dell'errore 502 nel log di nginx con il momento del log nginx.error. Un messaggio 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 connessione dell'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 un valore keepAliveTimeout
di 5000 millisecondi. In questo caso, puoi impostare server.keepAliveTimeout
su 700000 millisecondi.
Per risolvere il problema, controlla i log scritti dal codice in esecuzione nel contenitore dell'app collegandoti all'istanza VM e, se necessario, aggiungi altri log per trovare la causa principale.
Memoria insufficiente
Il seguente errore di esaurimento della memoria si verifica nell'ambiente flessibile di App Engine e in genere viene visualizzato con 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 ha memoria insufficiente. Per impostazione predefinita, l'ambiente flessibile App Engine ha 1 GB di memoria, con solo 600 MB disponibili per il contenitore dell'applicazione.
Per risolvere il problema, controlla i log per verificare la presenza di una voce di memoria insufficiente, aggiorna la configurazione di memory_gb
nel file app.yaml
ed esegui nuovamente il deployment.
Connessioni aperte insufficienti per gestire le richieste in arrivo
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 monitoraggio cloud 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.