Resolver problemas de veiculação no App Engine

Esta página descreve erros comuns de inicialização e veiculação de apps no App Engine e métodos para resolvê-los.

Erro de permissão ao criar um app com a conta de serviço padrão

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

CLI da 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

Solicitar registros

Service account creation is not allowed on this project.

Console

Error while initialising App Engine.

Esse erro pode ocorrer devido à aplicação da restrição da política da organização constraints/iam.disableServiceAccountCreation ao criar seu app. Essa política impede o provisionamento da conta de serviço padrão do App Engine PROJECT_ID@appspot.gserviceaccount.com.

Para resolver esse problema, remova temporariamente a restrição constraints/iam.disableServiceAccountCreation da política da organização para permitir a criação e a implantação da conta de serviço padrão do App Engine. A conta de serviço padrão é necessária para a criação do app e não pode ser ignorada. Isso também se aplica quando você usa uma conta de serviço por versão. A conta de serviço padrão do App Engine pode ser excluída ou substituída por uma conta de serviço criada após a implantação bem-sucedida.

Se você estiver usando uma conta de serviço criada, consulte a Visão geral de recomendações de papéis para entender como aplicar permissões de restrição, como fornecer um papel de criador de token na conta de serviço que você cria para o agente de serviço.

O aplicativo não está exibindo as mudanças mais recentes no código

Se o aplicativo não estiver exibindo as mudanças mais recentes do código após a implantação, use o sistema de arquivos raiz do contêiner para verificar o conteúdo. As etapas de solução de problemas a seguir mostram como buscar a imagem do contêiner e exportar o sistema de arquivos raiz para uma análise mais detalhada:

  1. Use o Cloud Logging para conseguir o URL da imagem do contêiner com o filtro GAE_FULL_APP_CONTAINER. Depois de aplicar o filtro, o Cloud Logging mostra o URL da imagem do contêiner, com 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 comando a seguir para exportar o URL da imagem do contêiner:

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

    Substitua:

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

    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 arquivos raiz (rootfs) da imagem do contêiner:

     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, se você não precisar do arquivo 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 arquivos raiz para verificar se as alterações mais recentes do código estão presentes.

  5. Execute o comando a seguir para limpar a imagem:

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

O Nginx falha ao se conectar ou entrar em contato com o contêiner do aplicativo

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

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

Esse erro indica que o proxy reverso nginx (arquivo secundário nginx) não consegue acessar o contêiner do app. Nos registros, é possível comparar o tempo de fechamento do erro 502 no registro nginx com o tempo do registro nginx.error. Um nginx.error seguido imediatamente por um erro nginx 502 é provavelmente a causa do erro nginx 502.

Esse erro geralmente ocorre quando o tempo limite de sinal de atividade da conexão do aplicativo é menor que o tempo limite do sinal de atividade do nginx. Como o nginx no ambiente flexível do App Engine tem keepalive_timeout de 650 segundos, os aplicativos precisam manter as conexões ativas por pelo menos esse período. Por padrão, os aplicativos Node.js têm um keepAliveTimeout de 5.000 milissegundos. Nesse caso, você pode definir server.keepAliveTimeout como 7.000.000 milissegundos.

Para resolver problemas, verifique os registros gravados pelo código em execução no contêiner do aplicativo. Conecte-se à instância de VM e adicione mais registros, 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 retorna 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

Esse erro indica que o App Engine encerrou o aplicativo.

Esse erro ocorre quando a instância tem memória insuficiente. Por padrão, o ambiente flexível do App Engine tem 1 GB de memória, com apenas 600 MB disponíveis para o contêiner do aplicativo.

Para resolver o problema, verifique se há uma entrada "Sem memória" nos registros e atualize a configuração memory_gb no arquivo app.yaml e faça a implantação novamente.

Conexões abertas insuficientes para lidar com as solicitações recebidas

Os apps poderão encontrar um erro 502 se o número máximo de conexões de espera for igual ou maior que 75% do número de conexões ativas.

Para resolver o problema, verifique as Métricas do Cloud Monitoring para o número máximo de conexões ativas e em espera e diminuir o número de conexões de espera para garantir que o número máximo de conexões de espera seja menor ou igual a 75% do número de conexões ativas.