Migrar a la biblioteca de cliente de Cloud para Storage

Cloud Storage permite que tu aplicación proporcione objetos de datos de gran tamaño, como archivos de vídeo o de imagen, y que tus usuarios suban archivos de datos de gran tamaño. En el entorno de ejecución de Python 2, App Engine proporciona su propia biblioteca de cliente para escribir y leer objetos en Cloud Storage. Esta biblioteca de App Engine no está disponible en los entornos de ejecución de App Engine más recientes, incluido el entorno de ejecución de Python 3.

Si tu aplicación de Python 2 usa la biblioteca GoogleAppEngineCloudStorageClient, debes migrar a la biblioteca de cliente de Cloud para Cloud Storage antes de poder ejecutar la aplicación en el tiempo de ejecución de Python 3. Ten en cuenta que solo tienes que migrar tu aplicación para usar una nueva biblioteca de cliente. Todos los objetos de datos y los permisos de tus segmentos de Cloud Storage no cambian, y puedes acceder a tus segmentos con la nueva biblioteca de cliente.

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

Similitudes:

  • La biblioteca de cliente de Cloud admite todas las funciones de Cloud Storage habilitadas por la biblioteca de cliente de App Engine, como leer, escribir, eliminar y enumerar objetos. La migración solo debería requerir pequeños cambios en el código.

    La biblioteca de cliente de Cloud también admite otras funciones, como crear y etiquetar cubos, y recuperar versiones anteriores de objetos.

Diferencias:

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

  • La biblioteca de cliente de App Engine requiere que uses listas de control de acceso (LCA) para controlar el acceso a los segmentos y objetos. Sin embargo, Cloud Storage y la biblioteca de cliente de Cloud admiten dos sistemas para conceder a los usuarios permiso para acceder a tus segmentos y objetos: las LCA y el acceso uniforme a nivel de segmento. El acceso uniforme a nivel de segmento ofrece una experiencia de control de acceso más sencilla y coherente en todos tus recursos de Cloud.

    Todas las listas de control de acceso que hayas usado con la biblioteca de cliente de App Engine seguirán vigentes en tus cubos después de migrar a la biblioteca de cliente de Cloud. Además, podrás seguir usando listas de control de acceso si lo necesitas.

    Si el acceso uniforme a nivel de segmento se ajusta a tus necesidades, te recomendamos que uses este sistema más sencillo para los segmentos que crees. Aunque puedes convertir los segmentos que ya tengas para que usen el acceso uniforme a nivel de segmento, es posible que tengas que hacer cambios significativos en la forma en que tu aplicación protege el acceso a sus objetos de almacenamiento.

Ejemplos de código:

Antes de empezar la migración

Si aún no lo has hecho, configura tu entorno de desarrollo de Python para usar una versión de Python compatible con Google Cloude instala herramientas de prueba para crear entornos de Python aislados.

Información sobre los permisos de Cloud Storage

De forma predeterminada, la cuenta de servicio predeterminada creada automáticamente de tu aplicación tiene privilegios de lectura y escritura en los segmentos de tu proyecto, así como derechos completos sobre los objetos que crea, tanto antes como después de la migración.

Si has usado otra cuenta de servicio o de usuario para proteger el acceso a tus cubos y 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.

Visión general del proceso de migración

Para migrar tu aplicación de Python a la biblioteca de cliente de Cloud para Cloud Storage en lugar de a la biblioteca de cliente de App Engine, sigue estos pasos:

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

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

  3. Prueba las actualizaciones.

  4. Despliega tu aplicación en App Engine.

Instalar la biblioteca de cliente de Cloud para Cloud Storage

Para que la biblioteca de cliente de Cloud para Cloud Storage esté disponible para tu aplicación cuando se ejecute en App Engine, haz lo siguiente:

  1. Actualiza el archivo de app.yaml:

    1. Si usas bibliotecas de cliente de Cloud, añade las versiones más recientes de las bibliotecas grpcio y setuptools.
    2. Añade la biblioteca ssl, ya que Cloud Storage la necesita.

    A continuación, se muestra un ejemplo de archivo 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
    

    Algunas bibliotecas de cliente no necesitan la biblioteca SSL. Si no incluyes la biblioteca SSL en una biblioteca de cliente que la necesite, verás un error SSL en el Explorador de registros cuando tu aplicación reciba una solicitud.

  2. Actualiza el archivo requirements.txt añadiendo las bibliotecas de cliente de Cloud para Cloud Storage a tu lista de dependencias:

    google-cloud-storage==1.24.1
    

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

    A continuación, ejecuta pip install -t lib -r requirements.txt para actualizar la lista de bibliotecas disponibles para tu aplicación.

  3. En el caso de las aplicaciones de Python 2, si tu aplicación usa bibliotecas integradas o copiadas, debes especificar esas rutas en el archivo 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 presupone que la carpeta lib se encuentra en el directorio de trabajo actual. Si no puedes garantizar que lib siempre esté 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')

Actualizar el código para usar la biblioteca de cliente de Cloud

Crear un cliente de Cloud Storage

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

from google.cloud import storage

client = storage.Client()

En el escenario de autorización predeterminado descrito anteriormente, el cliente de Cloud Storage contiene credenciales de la cuenta de servicio predeterminada de App Engine, que está autorizada para interactuar con los cubos y objetos de tu proyecto. Si no trabajas en este caso predeterminado, consulta Credenciales predeterminadas de la aplicación (ADC) para obtener información sobre cómo proporcionar credenciales.

Usar métodos de bibliotecas de cliente de Cloud

En la siguiente tabla se resumen los métodos de la biblioteca de cliente de Cloud que se deben usar al implementar funciones específicas de Cloud Storage.

Función de Cloud Storage Métodos de cliente de Cloud
Mostrar los objetos de un segmento Client.list_blobs

Consulta un ejemplo de código sencillo y un ejemplo de emulación del modo de directorio.

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

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

Consulta un ejemplo de código.

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

Para tener un control más detallado, usa bucket.acl.reload() o blob.acl.reload() para obtener las LCA que estén definidas. A continuación, usa los métodos ACL para añadir o quitar listas de control de acceso. Consulta un ejemplo de código.

Leer del almacenamiento blob.download_to_file
blob.download_to_filename
blob.download_as_string

Consulta un ejemplo de código.

Eliminar un objeto blob.delete

Consulta un ejemplo de código.

Copiar un objeto bucket.copy_blob

Consulta un ejemplo de código.

Leer los metadatos de un objeto blob.propertyname
y
blob.metadata

Consulta un ejemplo de código.

Probar las actualizaciones

Puedes probar las actualizaciones de tu aplicación en un entorno local, pero todas las solicitudes de Cloud Storage deben enviarse a través de Internet a un segmento 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 aplicaciones de Python 2, consulta Usar el servidor de desarrollo local.

Para obtener más información sobre cómo probar aplicaciones de Python 3, consulta Probar y desplegar tu aplicación.

Desplegar una aplicación

Cuando tengas todo listo para desplegar tu aplicación, debes hacer lo siguiente:

  1. Prueba la aplicación en App Engine.

  2. Si la aplicación se ejecuta sin errores, usa la división del tráfico para aumentar lentamente el tráfico de la aplicación actualizada. Monitoriza la aplicación de cerca para detectar cualquier problema antes de dirigir más tráfico a la aplicación actualizada.