Migrar para a biblioteca de cliente da nuvem para o armazenamento

O Cloud Storage permite à sua aplicação publicar objetos de dados grandes, como ficheiros de vídeo ou de imagem, e permite aos seus utilizadores carregar ficheiros de dados grandes. No tempo de execução do Python 2, o App Engine fornece a sua própria biblioteca cliente para escrever e ler objetos no Cloud Storage. Esta biblioteca do App Engine não está disponível em tempos de execução do App Engine mais recentes, incluindo o tempo de execução do Python 3.

Se a sua app Python 2 usar a biblioteca GoogleAppEngineCloudStorageClient, tem de migrar para a biblioteca cliente Google Cloud para o Cloud Storage antes de poder executar a app no tempo de execução do Python 3. Tenha em atenção que só precisa de migrar a sua app para usar uma nova biblioteca de cliente. Todos os objetos de dados e autorizações nos seus contentores do Cloud Storage existentes permanecem inalterados, e pode aceder aos seus contentores existentes através da nova biblioteca de cliente.

Comparação entre o App Engine e as bibliotecas cliente da Google Cloud

Semelhanças:

  • A biblioteca cliente do Google Cloud suporta todas as funcionalidades do Cloud Storage ativadas pela biblioteca cliente do App Engine, como ler, escrever, remover e listar objetos. A migração deve exigir apenas pequenas alterações ao seu código.

    A biblioteca cliente da nuvem também suporta funcionalidades adicionais, como a criação e a etiquetagem de contentores, e a obtenção de versões mais antigas de objetos.

Diferenças:

  • Na biblioteca do App Engine, a função que obtém uma lista de objetos funciona de forma assíncrona. A biblioteca de cliente do Google Cloud não fornece uma função assíncrona para listar objetos, embora possa usar a paginação e iterar através de um pequeno conjunto de objetos.

  • A biblioteca de cliente do App Engine requer que use listas de controlo de acesso (ACL) para controlar o acesso a contentores e objetos. No entanto, o Cloud Storage e a biblioteca de cliente da nuvem suportam dois sistemas para conceder aos utilizadores autorização para aceder aos seus contentores e objetos: as ACLs e o acesso de nível de contentor uniforme. O acesso de nível de contentor uniforme oferece uma experiência de controlo de acesso mais simples e consistente em todos os seus recursos na nuvem.

    Todas as ACLs que usou com a biblioteca cliente do App Engine permanecem em vigor para os seus contentores existentes após a migração para a biblioteca cliente da Google Cloud, e pode continuar a usar ACLs, se necessário.

    Se o acesso uniforme ao nível do contentor satisfizer as suas necessidades, recomendamos que use este sistema mais simples para todos os novos contentores que criar. Embora possa converter contentores existentes para usar o acesso uniforme ao nível do contentor, isto pode exigir alterações significativas à forma como a sua app protege o acesso aos respetivos objetos de armazenamento.

Exemplos de código:

Antes de começar a migrar

Se ainda não o fez, configure o seu ambiente de desenvolvimento Python para usar uma versão do Python compatível com o Google Cloude instale ferramentas de teste para criar ambientes Python isolados.

Compreender as autorizações do Cloud Storage

Por predefinição, a conta de serviço predefinida criada automaticamente da sua app tem privilégios de leitura e escrita nos contentores do seu projeto e tem direitos totais sobre os objetos que cria, antes e depois da migração.

Se usou uma conta de serviço ou uma conta de utilizador diferente para proteger o acesso aos seus contentores e objetos do Cloud Storage, certifique-se de que continua a usar as mesmas contas e técnicas de autenticação antes e depois da migração.

Vista geral do processo de migração

Para migrar a sua app Python para usar a biblioteca cliente do Google Cloud para o Cloud Storage em vez da biblioteca cliente do App Engine:

  1. Instale a biblioteca cliente do Google Cloud para o Cloud Storage.

  2. Atualize o seu código para usar a biblioteca de cliente da nuvem.

  3. Teste as atualizações.

  4. Implemente a sua app no App Engine.

Instalar a biblioteca cliente da nuvem para o Cloud Storage

Para disponibilizar a biblioteca cliente do Google Cloud para o Cloud Storage à sua app quando é executada no App Engine:

  1. Atualize o ficheiro app.yaml:

    1. Se usar as bibliotecas cliente da Google Cloud, adicione as versões mais recentes das bibliotecas grpcio e setuptools.
    2. Adicione a biblioteca ssl, uma vez que é necessária para o Cloud Storage.

    Segue-se um exemplo de um ficheiro app.yaml:

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: 1.0.0
    - name: setuptools
      version: 36.6.0
    - name: ssl
      version: latest
    

    Algumas bibliotecas cliente não precisam da biblioteca SSL. Se não incluir a biblioteca SSL para uma biblioteca de cliente que a necessite, é apresentado um erro de SSL no Explorador de registos quando a sua app recebe um pedido.

  2. Atualize o ficheiro requirements.txt adicionando as bibliotecas de cliente da nuvem para o Cloud Storage à sua lista de dependências:

    google-cloud-storage==1.24.1
    

    Recomendamos que use a versão 1.24.1 da biblioteca cliente do Cloud Storage, uma vez que suporta apps Python 2.7.

    Em seguida, execute pip install -t lib -r requirements.txt para atualizar a lista de bibliotecas disponíveis para a sua app.

  3. Para apps Python 2, se a sua app estiver a usar bibliotecas incorporadas ou copiadas, tem de especificar esses caminhos no ficheiro 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)
    

    O ficheiro appengine_config.py no exemplo anterior pressupõe que a pasta lib está localizada no diretório de trabalho atual. Se não puder garantir que lib está sempre no diretório de trabalho atual, especifique o caminho completo para a pasta lib. Por exemplo:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')

Atualizar o código para usar a biblioteca de cliente da nuvem

Criar um cliente do Cloud Storage

Para usar a biblioteca cliente da Google Cloud para o Cloud Storage, crie um Client objeto. O cliente contém credenciais e outros dados necessários para estabelecer ligação ao Cloud Storage. Por exemplo:

from google.cloud import storage

client = storage.Client()

No cenário de autorização predefinido descrito anteriormente, o cliente do Cloud Storage contém credenciais da conta de serviço predefinida do App Engine, que está autorizada a interagir com os contentores e os objetos do seu projeto. Se não estiver a trabalhar neste cenário predefinido, consulte as Credenciais predefinidas da aplicação (ADC) para obter informações sobre como fornecer credenciais.

Usar métodos da biblioteca cliente do Google Cloud

A tabela seguinte resume os métodos da biblioteca cliente da nuvem a usar quando implementar funcionalidades específicas do Cloud Storage.

Funcionalidade do Cloud Storage Métodos de cliente na nuvem
Liste objetos num contentor Client.list_blobs

Veja um exemplo de código simples e um exemplo de emulação do modo de diretório.

Para percorrer a lista de objetos, use a propriedade pages do objeto iterador que Client.list_blobs devolve.

Gravar no armazenamento blob.upload_from_file
blob.upload_from_filename
blob.upload_from_string

Veja um exemplo de código.

Especifique LCAs (Listas de controlo de acesso) Para aplicar uma ACL predefinida, use o parâmetro predefined_acl quando criar um contentor ou criar um objeto.

Para um controlo mais detalhado, use bucket.acl.reload() ou blob.acl.reload() para obter todas as ACLs atualmente definidas. Em seguida, use os métodos ACL para adicionar ou remover ACLs. Veja um exemplo de código.

Ler a partir do armazenamento blob.download_to_file
blob.download_to_filename
blob.download_as_string

Veja um exemplo de código.

Elimine um objeto blob.delete

Veja um exemplo de código.

Copie um objeto bucket.copy_blob

Veja um exemplo de código.

Leia os metadados de um objeto blob.propertyname
e
blob.metadata

Veja um exemplo de código.

Testar as atualizações

Pode testar as atualizações da sua app num ambiente local, mas todos os pedidos do Cloud Storage têm de ser enviados através da Internet para um contentor do Cloud Storage real. Nem o App Engine nem o Cloud Storage fornecem um emulador do Cloud Storage.

Para mais informações sobre os testes de apps Python 2, consulte o artigo Usar o servidor de desenvolvimento local.

Para mais informações sobre os testes de apps Python 3, consulte o artigo Testar e implementar a sua aplicação.

Implementar a sua app

Quando tiver tudo pronto para implementar a sua app, deve:

  1. Teste a app no App Engine.

  2. Se a app for executada sem erros, use a divisão de tráfego para aumentar gradualmente o tráfego para a app atualizada. Monitorize atentamente a app para detetar problemas antes de encaminhar mais tráfego para a app atualizada.