O Python 2 não é mais compatível com a comunidade. Recomendamos que você migre aplicativos do Python 2 para o Python 3.

Visão geral da migração de serviços incluídos no App Engine

O ambiente de execução do Python 3 no ambiente de execução padrão do App Engine não inclui serviços incluídos, como Memcache e Filas de tarefas. Em vez disso, o Google Cloud fornece produtos independentes que são equivalentes à maioria dos serviços incluídos no ambiente de execução do Python 2. Para os serviços incluídos que não estão disponíveis como produtos separados no Google Cloud, como processamento de imagens, pesquisa e mensagens, este guia de migração recomenda provedores terceirizados ou outras soluções alternativas.

Nesta página, apresentamos o caminho de migração de cada serviço incluído. Forneceremos guias de migração detalhados para alguns desses serviços nos próximos meses.

Noções básicas sobre as permissões do Google Cloud

Como o app migrado e os serviços do Google Cloud que ele usa não estão mais sendo executados no mesmo ambiente "sandbox", seu app precisa de autorização para acessar cada serviço. Por exemplo, para interagir com o Datastore ou o Cloud Tasks, seu aplicativo precisa fornecer as credenciais de uma conta que está autorizada a acessar esses serviços.

Por padrão, os aplicativos do ambiente de execução padrão do App Engine fornecem as credenciais da conta de serviço padrão do App Engine, que está autorizada a acessar bancos de dados no mesmo projeto que o aplicativo.

Se alguma das seguintes condições for verdadeira, você precisará usar uma técnica de autenticação alternativa que forneça credenciais explicitamente:

  • Seu aplicativo e o banco de dados do Memorystore estão em projetos diferentes do Google Cloud.

  • Você alterou os papéis atribuídos à conta de serviço padrão do App Engine.

Para saber mais sobre técnicas de autenticação alternativas, veja Como configurar a autenticação para aplicativos de produção de servidor para servidor.

Autenticação para desenvolvimento local

Para desenvolver ou testar seu aplicativo localmente, recomendamos criar e usar uma conta de serviço. Não use a conta de serviço padrão do App Engine, porque ela tem um alto nível de permissões para tudo no projeto. Em vez disso, crie e use uma conta de serviço com o nível mais baixo de permissões necessárias para sua tarefa específica de desenvolvimento e teste.

Para instruções sobre como configurar uma conta de serviço e conectá-la ao seu aplicativo, leia consulte Como receber e fornecer credenciais da conta de serviço manualmente.

Como instalar bibliotecas de cliente

A maneira mais fácil de usar os serviços do Google Cloud a partir de um aplicativo Python é instalar a biblioteca de cliente Python do serviço. Os serviços do Google Cloud também oferecem JSON REST e outras interfaces. As etapas para instalar as bibliotecas de cliente no ambiente de execução do App Engine são diferentes para aplicativos Python 2 e aplicativos Python 3.

Como instalar bibliotecas para aplicativos Python 2

Para instalar uma biblioteca para seu aplicativo usar quando estiver em execução no ambiente de execução do Python 2:

  1. Crie um diretório para armazenar bibliotecas de terceiros, como lib/.

  2. Crie um arquivo requirements.txt na mesma pasta que seu arquivo app.yaml e adicione o nome de uma biblioteca cliente com a biblioteca googleapis_common_protos.

    É necessário googleapis_common_protos para os aplicativos Python 2 acessarem os serviços do Google Cloud.

    Por exemplo, o arquivo a seguir pode ser usado para instalar bibliotecas para googleapis_common_protos, Pub/Sub e Cloud Tasks:

    googleapis_common_protos
    google-cloud-pubsub
    google-cloud-tasks
    
  3. Use pip install para instalar as bibliotecas na pasta que você criou. Exemplo:

    pip install -t lib -r requirements.txt
    
  4. Especifique a biblioteca RPC na seção libraries do arquivo app.yaml:

    libraries:
    - name: grpcio
      version: 1.0.0
    
  5. Crie um arquivo appengine_config.py na mesma pasta que seu app.yaml arquivo, se você ainda não tiver um. Adicione a instrução a seguir ao seu arquivo appengine_config.py:

    # appengine_config.py
    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set path to your libraries folder.
    path = 'lib'
    # Add libraries installed in the path folder.
    vendor.add(path)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(path)
    

    Use o módulo pkg_resources, que garante que o aplicativo use a distribuição correta das bibliotecas de cliente.

    O arquivo appengine_config.py no exemplo anterior pressupõe que a pasta lib está localizada no diretório de trabalho atual. Se não for possível garantir que lib estará sempre no diretório de trabalho atual, especifique o caminho completo para a pasta lib. Exemplo:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    
  6. Implante o aplicativo.

O App Engine faz upload de todas as bibliotecas no diretório especificado no arquivo appengine_config.py para o ambiente de execução do Python 2.

Como instalar bibliotecas para aplicativos Python 3

Para instalar uma biblioteca para seu aplicativo usar quando estiver em execução no ambiente de execução do Python 3:

  1. Adicione o nome da biblioteca do arquivo requirements.txt do seu aplicativo. Exemplo:

    google-cloud-ndb
    
  2. Implantar o aplicativo.

O App Engine faz o upload automático de todas as bibliotecas listadas no arquivo requirements.txt para o ambiente de execução do Python 3.

Caminhos de migração para serviços incluídos no App Engine

Blobstore

Para armazenar e recuperar dados, use o Cloud Storage por meio das bibliotecas de cliente do Cloud. Para começar, consulte Como migrar para a biblioteca de cliente do Cloud para armazenamento.

Datastore

Se o aplicativo Python 2 usa o NDB para interagir com o Datastore, migre para a biblioteca Python 3 do Cloud NDB. Novos aplicativos Python 3 devem usar a biblioteca de cliente no modo Datastore.

Para detalhes, consulte:

Imagens

É possível veicular imagens a partir do Cloud Storage, veiculá-las diretamente ou usar uma rede de fornecimento do conteúdo (CDN) terceirizada.

Para redimensionar, converter e manipular imagens, use uma biblioteca de processamento de imagens, como o Pillow ou uma interface Python para o ImageMagick. Para usar uma dessas bibliotecas de terceiros, adicione a biblioteca como uma dependência e atualize seu código para chamar as APIs da biblioteca.

O serviço de imagens do App Engine também oferece funcionalidades para evitar solicitações dinâmicas ao seu aplicativo. Para isso, ele realiza o redimensionamento de imagens por meio de um URL de exibição. Se você quiser uma funcionalidade semelhante, poderá gerar as imagens redimensionadas com antecedência e enviá-las ao Cloud Storage para veiculação. Como alternativa, é possível é usar um serviço de rede de fornecimento de conteúdo (CDN, na sigla em inglês) de terceiros que ofereça redimensionamento de imagens.

Logging

Os registros da solicitação ainda aparecem no Cloud Logging, mas não são mais correlacionados automaticamente. Para implementar o comportamento de geração de registros desejado, você pode usar as bibliotecas de cliente do Cloud Logging.

Mail

Para enviar e-mails, use um provedor de email terceirizado, como SendGrid, Mailgun ou Mailjet (todos em inglês). Todos esses serviços oferecem APIs para enviar e-mails a partir de aplicativos.

Memcache

Se seu aplicativo Python 2 usar explicitamente o Memcache, você precisará migrar para outra solução de armazenamento em cache antes de executar seu aplicativo em um ambiente Python 3. Recomendamos o uso do Memorystore para Redis como serviço de armazenamento em cache. Para detalhes, consulte Como migrar o Memcache para o Memorystore.

Módulos

Para mais informações e saber como modificar os serviços em execução do aplicativo, use uma combinação de variáveis de ambiente e a API Admin do App Engine:

Informações de serviços Como acessar
ID do aplicativo atual Por meio da variável de ambiente GAE_APPLICATION.
ID do projeto atual Por meio da variável de ambiente GOOGLE_CLOUD_PROJECT.
Nome do serviço atual Por meio da variável de ambiente GAE_SERVICE.
Versão do serviço atual Por meio da variável de ambiente GAE_VERSION.
ID da instância atual Por meio da variável de ambiente GAE_INSTANCE.
Nome do host padrão Método apps.get da API Admin
Lista de serviços Método apps.services.list da API Admin
Lista de versões de um serviço Método apps.services.versions.list da API Admin
Versão padrão de um serviço, incluindo qualquer divisão de tráfego Método apps.services.get da API Admin
Lista de instâncias em execução de uma versão Método apps.services.versions.instances.list da API Admin

Para mais informações sobre os dados disponíveis acerca dos serviços em execução do aplicativo, consulte Ambiente de execução do Python 2.

Namespaces

A API Namespaces permitia que os aplicativos multilocatários particionassem dados por locatários simplesmente especificando uma string de namespace exclusiva para cada locatário.

Enquanto o Datastore suporta multilocação diretamente, outros serviços do Google Cloud não. Se o aplicativo multilocatário usa outros serviços do Google Cloud, você precisa processar a multilocação manualmente. Para ter instâncias de serviços completamente isoladas, crie projetos novos de maneira programática usando a API Cloud Resource Manager e acesse os recursos em todos os projetos.

OAuth

Em vez de usar o serviço OAuth do App Engine para verificar os tokens do OAuth 2.0, use o método oauth2.tokeninfo da API OAuth 2.0.

Hospede qualquer banco de dados de pesquisa de texto completo, como o ElasticSearch no Compute Engine, e acesse-o do serviço.

Fila de tarefas

Migre filas pull para o Pub/Sub e migre filas push para o Cloud Tasks. Se o aplicativo usa filas pull e push, migre as filas pull primeiro para evitar que o Cloud Tasks se comporte de maneira inesperada.

Para detalhes sobre como realizar essas migrações, consulte:

Autenticação do usuário

Como alternativa, use qualquer mecanismo de autenticação com base em HTTP em vez da API Users, como: