Migra a la biblioteca cliente de Cloud para Storage

Cloud Storage permite que tu aplicación entregue objetos de datos grandes, como archivos de video o imágenes, y permite que tus usuarios suban archivos de datos grandes. En el entorno de ejecución de Python 2, App Engine proporciona su propia biblioteca cliente para escribir y leer objetos en Cloud Storage. Esta biblioteca de App Engine no está disponible en los entornos de ejecución más recientes de App Engine, incluido el entorno de ejecución de Python 3.

Si tu app de Python 2 usa la biblioteca GoogleAppEngineCloudStorageClient, debes migrar a la biblioteca cliente de Cloud para Cloud Storage antes de poder ejecutar la app en el entorno de ejecución de Python 3. Ten en cuenta que solo debes migrar la app para usar una biblioteca cliente nueva. Todos los objetos y permisos de los datos de los depósitos de Cloud Storage existentes no se modifican, y puedes acceder a los depósitos existentes mediante la biblioteca cliente nueva.

Comparación de las bibliotecas cliente de App Engine y Cloud

Similitudes:

  • La biblioteca cliente de Cloud es compatible con todas las características de Cloud Storage que habilita la biblioteca cliente de App Engine, como leer, escribir, quitar y enumerar objetos. La migración solo debe requerir cambios pequeños en el código.

    La biblioteca cliente de Cloud también admite características adicionales, como crear y etiquetar depósitos, y recuperar versiones anteriores de objetos.

Diferencias:

  • En la biblioteca de App Engine, la función que recupera una lista de objetos funciona de forma asíncrona. La biblioteca cliente de Cloud no proporciona una función asíncrona a fin de enumerar objetos, aunque puedes usar la paginación para iterar a través de un conjunto pequeño de objetos.

  • La biblioteca cliente de App Engine requiere que uses las listas de control de acceso (LCA) para controlar el acceso a los depósitos y los objetos. Sin embargo, Cloud Storage y la biblioteca cliente de Cloud admiten dos sistemas a fin de otorgar permiso a los usuarios para acceder a los depósitos y objetos: las LCA y el acceso uniforme a nivel de depósito. El acceso uniforme a nivel de bucket proporciona una experiencia de control de acceso más simple y coherente en todos tus recursos de Cloud.

    Todas las LCA que usaste con la biblioteca cliente de App Engine permanecerán vigentes para los depósitos existentes después de migrar a la biblioteca cliente de Cloud, y puedes seguir usando las LCA si es necesario.

    Si el acceso uniforme a nivel de bucket se adapta a tus necesidades, te recomendamos que uses este sistema más simple para cualquier bucket nuevo que crees. Si bien puedes convertir bucket s existentes para usar el acceso uniforme a nivel de bucket, puede que esto requiera cambios significativos con respecto a cómo la app protege el acceso a sus objetos de almacenamiento.

Muestras de código:

Antes de comenzar la migración

Conceptos básicos sobre los permisos de Cloud Storage

De forma predeterminada, la cuenta de servicio predeterminada de la app tiene privilegios de lectura y escritura para los depósitos de tu proyecto, y tiene derechos totales a los objetos que crea antes y después de la migración.

Si usaste una cuenta de servicio o una cuenta de usuario diferente para proteger el acceso a los buckets y los objetos de Cloud Storage, asegúrate de seguir usando las mismas cuentas y técnicas de autenticación antes y después de la migración.

Descripción general del proceso de migración

Si deseas migrar la app de Python a fin de usar la biblioteca cliente de Cloud para Cloud Storage en lugar de la biblioteca cliente de App Engine, haz lo siguiente:

  1. Instala la biblioteca cliente de Cloud para Cloud Storage.

  2. Actualiza el código para usar la biblioteca cliente de Cloud.

  3. Prueba las actualizaciones.

  4. Implementa la app en App Engine.

Instala la biblioteca cliente de Cloud para Cloud Storage

A fin de que la biblioteca cliente de Cloud para Cloud Storage esté disponible en tu app cuando se ejecuta en App Engine, sigue estos pasos:

  1. Crea un archivo requirements.txt en la misma carpeta que el archivo app.yaml y agrega las siguientes líneas:

     google-cloud-storage==1.24.1
    

    Te recomendamos usar la versión 1.24.1 de la biblioteca cliente de Cloud Storage, ya que es compatible con las apps de Python 2.7.

  2. En el archivo app.yaml de la aplicación, especifica las bibliotecas RPC y setuptools de Google obligatorias y la biblioteca SSL opcional en la sección libraries:

    libraries:
    - name: grpcio
      version: 1.0.0
    - name: setuptools
      version: 36.6.0
    - name: ssl
      version: latest
    

    Algunas bibliotecas cliente no necesitan la biblioteca SSL. Si no incluyes la biblioteca SSL para una biblioteca cliente que la necesita, verás un error de SSL en el visor de registros cuando tu app reciba una solicitud.

  3. Crea un directorio para almacenar tus bibliotecas de terceros, como lib/. Luego, usa pip install para instalar las bibliotecas en el directorio. Por ejemplo:

      pip install -t lib -r requirements.txt
      

  4. Crea un archivo appengine_config.py en la misma carpeta que el archivo app.yaml. Agrega lo siguiente al archivo 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)
    

    En el archivo appengine_config.py del ejemplo anterior, se supone que la carpeta lib se encuentra en el directorio de trabajo actual. Si no puedes garantizar que lib esté siempre en el directorio de trabajo actual, especifica la ruta completa a la carpeta lib. Por ejemplo:

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

En el caso del desarrollo local, recomendamos que instales dependencias en un entorno virtual como virtualenv para Python 2.

Actualiza tu código para usar la biblioteca cliente de Cloud

Crea un cliente de Cloud Storage

Si deseas usar la biblioteca cliente de Cloud para Cloud Storage, crea un objeto Client. El cliente contiene credenciales y otros datos necesarios para conectarse a Cloud Storage. Por ejemplo:

from google.cloud import storage

client = storage.Client()

En la situación de autorización predeterminada descrita antes, el cliente de Cloud Storage contiene credenciales de la cuenta de servicio predeterminada de App Engine, que está autorizada para interactuar con los buckets y los objetos de tu proyecto. Si no trabajas en esta situación predeterminada, consulta Credenciales predeterminadas de la aplicación (ADC) para obtener información sobre cómo proporcionarlas.

Usa los métodos de la biblioteca cliente de Cloud

En la siguiente tabla, se resumen qué métodos de la biblioteca cliente de Cloud debes usar para implementar funciones específicas de Cloud Storage.

Función de Cloud Storage Métodos del cliente de Cloud
Hacer una lista de objetos de un bucket Client.list_blobs

Consulta una muestra de código simple y una muestra del modo de emulación de directorio.

Para desplazarte por la lista de objetos, usa la propiedad pages del objeto iterador que muestra Client.list_blobs.

Escribir en el almacenamiento blob.upload_from_file
blob.upload_from_filename
blob.upload_from_string

Consulta una muestra de código.

Especificar las LCA Para aplicar una LCA predefinida, usa el parámetro predefined_acl cuando crees un bucket o un objeto.

Para obtener un control más detallado, usa bucket.acl.reload() o blob.acl.reload() a fin de recuperar las LCA definidas en este momento. Luego, usa los métodos ACL para agregar o quitar LCA. Consulta una muestra de código.

Leer desde el almacenamiento blob.download_to_file
blob.download_to_filename
blob.download_as_string

Consulta una muestra de código.

Borrar un objeto blob.delete

Consulta una muestra de código.

Copiar un objeto bucket.copy_blob

Consulta una muestra de código.

Leer metadatos para un objeto blob.propertyname
y
blob.metadata

Consulta una muestra de código.

Prueba tus actualizaciones

Puedes probar las actualizaciones de la app en un entorno local, pero todas las solicitudes de Cloud Storage deben enviarse por Internet a un bucket de Cloud Storage real. Ni App Engine ni Cloud Storage proporcionan un emulador de Cloud Storage.

Para obtener más información sobre cómo probar las apps de Python 2, consulta Usa el servidor de desarrollo local.

Para obtener más información sobre cómo probar las apps de Python 3, consulta Implementa y prueba tu aplicación.

Implementa tu app

Cuando estés listo para implementar tu app, debes hacer lo siguiente:

  1. Prueba la app en App Engine.

  2. Si la app se ejecuta sin errores, usa la división de tráfico a fin de aumentar de forma gradual el tráfico de tu app actualizada. Supervisa la app para detectar cualquier problema antes de enrutar más tráfico a la app actualizada.