Ambiente de execução do Python 3

O ambiente de execução do Python 3.7 é a pilha de software responsável por instalar o código do serviço da Web e as dependências dele, além de executar o serviço.

O ambiente de execução do Python 3.7 para o Google App Engine no ambiente padrão é declarado no arquivo app.yaml:

runtime: python37

Versão do Python 3

O ambiente de execução do Python 3.7 usa a versão estável mais recente do Python 3.7. As versões secundárias do App Engine são atualizadas automaticamente na implantação. No entanto, a versão principal precisa ser atualizada manualmente.

Por exemplo, se o aplicativo tiver sido implantado no Python 3.7.0, posteriormente será atualizado automaticamente para o Python 3.7.1, mas não será atualizado automaticamente para o Python 3.8.0.

Atualmente, o Python 3.7 é o único ambiente de execução do Python 3 disponível no ambiente padrão do App Engine.

Dependências

Durante a implantação, o gerenciador de pacotes Python pip é usado pelo App Engine para instalar as dependências definidas no arquivo de metadados requirements.txt (ambos em inglês), localizado no diretório raiz do seu projeto. Não é preciso fazer o upload das dependências, porque é feita nova instalação pelo App Engine.

A especificação de dependências usando o padrão Pipfile/Pipfile.lock não é compatível atualmente e não é recomendado que esses arquivos estejam no seu projeto.

Inicialização do aplicativo

O aplicativo é iniciado no ambiente de execução usando o conteúdo do campo opcional chamado ponto de entrada, do seu arquivo app.yaml. Exemplo:

runtime: python37
entrypoint: gunicorn -b :$PORT main:app

Para que o aplicativo receba solicitações HTTP, seu ponto de entrada precisa iniciar um servidor da Web que atenda na porta especificada pela variável de ambiente PORT. O uso de um ponto de entrada é opcional. Se o aplicativo atender às seguintes condições, o App Engine usará gunicorn (em inglês) como servidor da Web e adicionará o pacote automaticamente ao arquivo requirements.txt.

  • A raiz do diretório de aplicativos contém um arquivo main.py com um objeto compatível com WSGI chamado app.

  • app.yaml não contém o campo ponto de entrada.

  • O aplicativo não contém arquivos Pipfile ou Pipfile.lock.

É possível usar outros frameworks da Web com o App Engine, como uwsgi e Tornado (ambos em inglês). O exemplo a seguir mostra como usar o uwsgi com o App Engine:

runtime: python37
entrypoint: uwsgi --http-socket :8080 --wsgi-file main.py --callable app --master --processes 1 --threads 2
uwsgi==2.0.17.1
flask==1.0.2

Seu aplicativo será executado por meio desse servidor da Web pré-configurado quando houver uma solicitação HTTP.

Práticas recomendadas do ponto de entrada

Não inclua gunicorn em seu arquivo requirements.txt, a menos que você esteja especificando o ponto de entrada.

Para um melhor desempenho, o ponto de entrada deve ser leve, porque ele é executado sempre que for criada uma nova instância do aplicativo.

É possível usar o campo "ponto de entrada" para ajustar o desempenho do seu aplicativo. Por exemplo, se você usar gunicorn como seu servidor da Web, poderá usar o sinalizador --workers (em inglês) no campo "ponto de entrada" para configurar o número de workers no seu aplicativo. A escolha do número de workers precisa corresponder ao tamanho da instância da implantação do App Engine:

Classe da instância Workers
F1 (padrão) 1
F2 2
F4 4
F4_1G 8
B1 (padrão) 1
B2 2
B4 4
B4_1G 8
B8 8

Essa orientação é um ponto de partida para a seleção do número de workers. Talvez seja necessário usar um número diferente de workers dependendo das características de desempenho do aplicativo. O exemplo abaixo mostra uma implantação do App Engine que usa dois workers gunicorn para auxiliar aplicativos:

runtime: python37
entrypoint: gunicorn -b :8080 -w 2 main:app

Variáveis de ambiente

As seguintes variáveis de ambiente são definidas pelo ambiente de execução:

Variável de ambiente Descrição
GAE_APPLICATION O código do aplicativo do App Engine.
GAE_DEPLOYMENT_ID O código da implantação atual.
GAE_ENV O ambiente do App Engine. Defina como standard.
GAE_INSTANCE O código da instância em que o serviço é executado no momento.
GAE_MEMORY_MB A quantidade de memória disponível para o processo do aplicativo em MB.
GAE_RUNTIME O ambiente de execução especificado no arquivo app.yaml.
GAE_SERVICE O nome de serviço especificado no arquivo app.yaml. Se nenhum nome for especificado, ele será definido como default.
GAE_VERSION O rótulo da versão atual do serviço.
GOOGLE_CLOUD_PROJECT O código do projeto do GCP associado ao aplicativo.
NODE_ENV Definido como production quando o serviço é implantado.
PORT A porta que recebe solicitações HTTP.

É possível definir mais variáveis de ambiente no arquivo app.yaml, mas não é possível modificar os valores acima, exceto NODE_ENV.

HTTPS e proxies de encaminhamento

O App Engine encerra as conexões HTTPS no balanceador de carga e encaminha as solicitações para o aplicativo. Em alguns aplicativos, é necessário determinar o protocolo e o IP de solicitação originais. O endereço IP do usuário está disponível no cabeçalho X-Forwarded-For padrão. Os aplicativos que necessitam dessa informação precisam configurar a biblioteca da Web para confiar no proxy.

Sistema de arquivos

O ambiente de execução inclui um sistema de arquivos completo. Este sistema é somente leitura, exceto no local /tmp, que é um disco virtual em que são armazenados dados na RAM da sua instância do App Engine.

Servidor de metadados

Cada instância do aplicativo pode usar o servidor de metadados do App Engine para consultar informações sobre a instância e o projeto.

É possível acessar o servidor de metadados por meio dos seguintes endpoints:

  • http://metadata
  • http://metadata.google.internal

A tabela a seguir lista os endpoints em que é possível fazer solicitações HTTP para metadados específicos.

Ponto de extremidade de metadados Descrição
/computeMetadata/v1/project/numeric-project-id Número do projeto atribuído ao seu projeto.
/computeMetadata/v1/project/project-id ID do projeto atribuído ao seu projeto.
/computeMetadata/v1/instance/zone Zona em que a instância está em execução.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email E-mail da conta de serviço padrão atribuído ao seu projeto.
/computeMetadata/v1/instance/service-accounts/default/ Lista todas as contas de serviço padrão do seu projeto.
/computeMetadata/v1/instance/service-accounts/default/scopes Lista todos os escopos compatíveis com as contas de serviço padrão.
/computeMetadata/v1/instance/service-accounts/default/token Retorna o token de autenticação que pode ser usado para autenticar o aplicativo em outras APIs do Google Cloud.

Por exemplo, para recuperar o ID do projeto, envie uma solicitação para http://metadata.google.internal/computeMetadata/v1/project/project-id.