Resolva problemas de publicação no App Engine

Esta página descreve erros comuns de inicialização e publicação de apps no App Engine e métodos para os resolver.

Erro de autorização ao criar uma app com a conta de serviço predefinida

Quando cria uma app depois de ativar a API App Engine pela primeira vez, pode falhar com os seguintes erros:

CLI 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

Pedir registos

Service account creation is not allowed on this project.

Consola

Error while initialising App Engine.

Este erro pode ocorrer devido à aplicação da restrição da política da organização constraints/iam.disableServiceAccountCreation quando cria a sua app. Esta política impede o aprovisionamento da conta de serviço predefinida do App Engine PROJECT_ID@appspot.gserviceaccount.com.

Para resolver este problema, tem de remover temporariamente a restrição constraints/iam.disableServiceAccountCreation da política da organização para permitir a criação e a implementação da conta de serviço predefinida do App Engine. A conta de serviço predefinida é necessária para a criação de apps e não pode ser ignorada. Isto também se aplica quando usa uma conta de serviço por versão. A conta de serviço predefinida do App Engine pode ser eliminada ou substituída por uma conta de serviço que criar após a implementação bem-sucedida.

Se estiver a usar uma conta de serviço que criou, reveja a Vista geral das recomendações de funções para compreender como aplicar restrições de autorizações, como fornecer uma função de criador de tokens na conta de serviço que cria para o agente de serviço.

A aplicação não está a publicar as alterações de código mais recentes

Se a sua aplicação não estiver a publicar as alterações de código mais recentes após a implementação, pode usar o sistema de ficheiros raiz do contentor para verificar o conteúdo. Os passos de resolução de problemas seguintes mostram como obter a imagem do contentor e exportar o sistema de ficheiros raiz para análise adicional:

  1. Use o Cloud Logging para obter o URL da imagem do contentor com o filtro GAE_FULL_APP_CONTAINER. Depois de aplicar o filtro, o Cloud Logging apresenta o URL da imagem do contentor com o seu nome de domínio totalmente qualificado (FQDN). Por exemplo, GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST.

  2. Execute o seguinte comando para exportar o URL da imagem do contentor:

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

    Substituição:

    • FQDN com o nome do domínio totalmente qualificado do URL da imagem do contentor.
    • PROJECT_ID com o ID do projeto do seu Google Cloud projeto.
    • SERVICE_NAME com o nome do seu serviço.
    • VERSION_ID com o ID da versão do serviço.
    • SHA256_DIGEST com o valor SHA256.
  3. Crie um novo contentor com o URL da imagem do contentor:

    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. Exporte o sistema de ficheiros de raiz (rootfs) da imagem do contentor:

     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
    

    Em alternativa, se não precisar do ficheiro TAR, execute o seguinte comando:

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

    Analise o conteúdo do sistema de ficheiros raiz para verificar se as alterações de código mais recentes estão presentes.

  5. Execute o seguinte comando para limpar a imagem:

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

O Nginx não consegue estabelecer ligação nem contactar o contentor de apps

O seguinte erro só ocorre no ambiente flexível do App Engine e, normalmente, é devolvido com erros 502 imediatamente após o erro:

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

Este erro indica que o proxy inverso do nginx (nginx sidecar) não consegue alcançar o contentor da app. Nos registos, pode comparar o momento do fecho do erro 502 no registo do nginx com o momento do registo de erros do nginx. Um nginx.error seguido imediatamente de um erro nginx 502 é provavelmente a causa do erro nginx 502.

Este erro ocorre frequentemente quando o limite de tempo limite de manutenção da ligação da aplicação é inferior ao limite de tempo limite de manutenção da ligação do nginx. Como o nginx no ambiente flexível do App Engine tem um limite de tempo de 650 segundos, as aplicações têm de manter as ligações ativas durante, pelo menos, este período.keepalive_timeout Por predefinição, as aplicações Node.js têm um tempo limite de keepAliveTimeout de 5000 milissegundos. Neste caso, pode definir server.keepAliveTimeout como 700 000 milissegundos.

Para resolver problemas, verifique os registos escritos pelo código em execução no contentor da app estabelecendo ligação à instância de VM e adicione mais registos, se necessário, para encontrar a causa principal.

Memória insuficiente

O seguinte erro de falta de memória ocorre no ambiente flexível do App Engine e, normalmente, é devolvido com erros 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 erro indica que o App Engine terminou a aplicação.

Este erro ocorre quando a instância tem memória insuficiente. Por predefinição, o ambiente flexível do App Engine tem 1 GB de memória, com apenas 600 MB disponíveis para o contentor da aplicação.

Para resolver problemas, verifique se existe uma entrada de memória insuficiente nos registos, atualize a configuração de memory_gb no ficheiro app.yaml e volte a implementar.

Ligações abertas insuficientes para processar pedidos recebidos

As apps podem encontrar um erro 502 se o número máximo de ligações em espera for igual ou superior a 75% do número de ligações ativas.

Para resolver o problema, verifique as métricas do Cloud Monitoring para o número máximo de ligações ativas e em espera e diminua o número de ligações em espera para garantir que o número máximo de ligações em espera é inferior ou igual a 75% do número de ligações ativas.