Integra Storage a Google Cloud

Cloud Storage for Firebase está estrechamente integrado en Google Cloud Los SDKs de Firebase para Cloud Storage almacenan archivos directamente en buckets de Google Cloud Storage y, a medida que crece tu app, puedes integrar otros servicios de Google Cloud como el procesamiento administrado, como App Engine o Cloud Functions, o APIs de aprendizaje automático, como Cloud Vision o Google Traductor.

Un proyecto de Firebase es, en realidad, un proyecto de Google Cloud que tiene habilitados parámetros de configuración y servicios adicionales específicos de Firebase. Esto significa que se puede acceder a cada bucket de Cloud Storage que uses con Cloud Storage for Firebase en Google Cloud (incluida su consola y sus APIs).

La integración en Google Cloud, incluida la importación de buckets existentes de Cloud Storage, requiere un proyecto de Firebase que tenga el plan de precios Blaze de pago por uso.

Consideraciones para las cuentas de servicio

Firebase usa cuentas de servicio de Google Cloud para operar y administrar servicios sin compartir credenciales de usuario. Cuando crees un proyecto de Firebase que use Cloud Storage, podrías observar que una cuenta de servicio correspondiente ya está disponible en tu proyecto: service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com. Para obtener más información, consulta Descripción general de las cuentas de servicio de Firebase.

Google Cloud Storage

Puedes usar las APIs de Google Cloud Storage para acceder a archivos subidos mediante los SDKs de Firebase para Cloud Storage, en especial para ejecutar operaciones más complejas, como copiar o mover un archivo, o crear una lista de todos los archivos disponibles en una referencia.

Es importante tener en cuenta que estas solicitudes usan opciones de control de acceso de Google Cloud Storage en lugar de Firebase Authentication y Cloud Storage Security Rules.

API

Además de los SDKs de Firebase para Cloud Storage, hay varias otras formas para acceder a los datos almacenados en tu bucket Cloud Storage, según lo que lo que quieren hacer. Si accedes a los datos en un servidor, te ofrecemos también bibliotecas de servidor, además de una API de RESTful XML compatible con JSON y S3, o si que necesitas crear secuencias de comandos para cambiar o realizar otras tareas administrativas, tenemos una herramienta de línea de comandos que te será útil.

SDKs de servidor de Google Cloud

Google Cloud ofrece SDKs de servidor de alta calidad para varios productos de nube, como Cloud Storage. Estas bibliotecas se encuentran disponibles en Node.js, Java, Go, Python, PHP y Ruby.

Para obtener más información, incluidas las instrucciones de instalación, autenticación y solución de problemas, consulta la documentación específica de la plataforma vinculada anteriormente.

A continuación, se muestran ejemplos de uso del SDK de Google Cloud Storage:

Node.js

    // Require gcloud
    var gcloud = require('google-cloud');

    // Enable Cloud Storage
    var gcs = gcloud.storage({
      projectId: 'grape-spaceship-123',
      keyFilename: '/path/to/keyfile.json'
    });

    // Reference an existing bucket.
    var bucket = gcs.bucket('my-existing-bucket');

    // Upload a local file to a new file to be created in your bucket.
    bucket.upload('/photos/zoo/zebra.jpg', function(err, file) {
      if (!err) {
        // "zebra.jpg" is now in your bucket.
      }
    });

    // Download a file from your bucket.
    bucket.file('giraffe.jpg').download({
      destination: '/photos/zoo/giraffe.jpg'
    }, function(err) {});
    

Java

    // Enable Cloud Storage
    Storage storage = StorageOptions.builder()
      .authCredentials(AuthCredentials.createForJson(new FileInputStream("/path/to/my/key.json"))
      .build()
      .service();

    // Upload a local file to a new file to be created in your bucket.
    InputStream uploadContent = ...
    BlobId blobId = BlobId.of("my-existing-bucket", "zebra.jpg");
    BlobInfo blobInfo = BlobInfo.builder(blobId).contentType("text/plain").build();
    Blob zebraBlob = storage.create(blobInfo, content);

    // Download a file from your bucket.
    Blob giraffeBlob = storage.get("my-existing-bucket", "giraffe.jpg", null);
    InputStream downloadContent = giraffeBlob.getInputStream();
    

Go

    // Enable Cloud Storage
    client, err := storage.NewClient(ctx, option.WithServiceAccountFile("path/to/keyfile.json"))
    if err != nil {
        log.Fatal(err)
    }

    // Download a file from your bucket.
    rc, err := client.Bucket("my-existing-bucket").Object("giraffe.jpg").NewReader(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer rc.Close()
    body, err := ioutil.ReadAll(rc)
    if err != nil {
        log.Fatal(err)
    }
    

Python

    # Import gcloud
    from google.cloud import storage

    # Enable Cloud Storage
    client = storage.Client()

    # Reference an existing bucket.
    bucket = client.get_bucket('my-existing-bucket')

    # Upload a local file to a new file to be created in your bucket.
    zebraBlob = bucket.get_blob('zebra.jpg')
    zebraBlob.upload_from_filename(filename='/photos/zoo/zebra.jpg')

    # Download a file from your bucket.
    giraffeBlob = bucket.get_blob('giraffe.jpg')
    giraffeBlob.download_as_string()
    

PHP

    // Require gcloud
    require 'vendor/autoload.php';
    use Google\Cloud\Storage\StorageClient;

    // Enable Cloud Storage
    $storage = new StorageClient([
        'projectId' => 'grape-spaceship-123'
    ]);

    // Reference an existing bucket.
    $bucket = $storage->bucket('my-existing-bucket');

    // Upload a file to the bucket.
    $bucket->upload(
        fopen('/photos/zoo/zebra.jpg', 'r')
    );

    // Download a file from your bucket.
    $object = $bucket->object('giraffe.jpg');
    $object->downloadToFile('/photos/zoo/giraffe.jpg');
    

Ruby

    # Require gcloud
    require "google/cloud"

    # Enable Cloud Storage
    gcloud = Google::Cloud.new "grape-spaceship-123", "/path/to/keyfile.json"
    storage = gcloud.storage

    # Reference an existing bucket.
    bucket = storage.bucket "my-existing-bucket"

    # Upload a file to the bucket.
    bucket.create_file "/photos/zoo/zebra.jpg", "zebra.jpg"

    # Download a file from your bucket.
    file = bucket.file "giraffe.jpg"
    file.download "/photos/zoo/#{file.name}"
    

API de REST

Si usas un lenguaje sin una biblioteca cliente, quieres hacer algo que las bibliotecas cliente no admiten o simplemente tienes un cliente HTTP favorito que prefieres usar, Google Cloud Storage ofrece APIs para JSON y XML.

Además de estas API de acceso a datos de almacenamiento, puedes usar la API de Cloud Storage para Firebase a fin de administrar los buckets de Cloud Storage para usarlos en proyectos de Firebase.

gsutil

gsutil es una herramienta de línea de comandos que te da acceso directo a Cloud Storage. Puedes usar gsutil para realizar una gran variedad de tareas de administración de objetos y buckets, como las siguientes:

  • Subir, descargar y borrar objetos
  • Crear listas de depósitos y objetos
  • Mover, copiar y cambiar nombres de objetos
  • Editar LCA de objetos y depósitos

gsutil permite otras operaciones avanzadas, como mover archivos de un directorio a otro o borrar todos los archivos en una ubicación determinada.

Mover todos los archivos de una referencia a otra es tan fácil como se muestra a continuación:

gsutil mv gs://bucket/old/reference gs://bucket/new/reference

Borrar todos los archivos en una referencia por lote es un proceso casi igual de intuitivo:

# Delete all files under a path
gsutil rm -r gs://bucket/reference/to/delete

# Delete all the files in a bucket but not the bucket gsutil rm -r gs://bucket/**

# Delete all the files AND the bucket # Removing the default bucket will break the Firebase SDKs for Cloud Storage and is strongly discouraged gsutil rm -r gs://bucket

Porcentajes de solicitudes

Google Cloud Storage es un servicio altamente escalable que usa el ajuste de escala automático para lograr porcentajes de solicitudes muy altos.

Google Cloud Storage es un servicio multiusuario, lo que significa que los usuarios comparten el mismo conjunto de recursos subyacentes. Para aprovechar al máximo estos recursos compartidos, los buckets tienen una capacidad inicial de E/S.

Cuando planifiques integrar Cloud Storage for Firebase en tu app, considera un porcentaje de solicitudes mínimo que tu app necesita para tener un buen rendimiento y realizar las solicitudes de manera eficiente. Revisa los lineamientos sobre los porcentajes de solicitudes y, en especial, sobre cómo aumentar el porcentaje de solicitudes.

Control de versiones de objetos

¿Alguna vez borraste información por accidente sin tener copias de seguridad de ella? Google Cloud Storage es compatible con el control de versiones de objetos, que proporciona una manera automática de crear copias de seguridad de tus datos y de restablecerlos a partir de esas copias. Puedes habilitar el control de versiones de objetos mediante el comando gsutil versioning set:

gsutil versioning set on gs://<your-cloud-storage-bucket>

Cloud Storage siempre toma la versión más reciente, de modo que si deseas restablecer un objeto, debes usar una de las otras APIs o herramientas descritas previamente para establecer el objeto que desees como el más reciente.

Administración del ciclo de vida de los objetos

Tener la capacidad de archivar o borrar archivos inactivos de forma automática es una función útil para muchas aplicaciones. Afortunadamente, Google Cloud Storage proporciona Administración del ciclo de vida de los objetos, que te permite borrar o archivar objetos después un período determinado.

Piensa en una aplicación para compartir fotos en la que deseas borrar todas las fotos al cabo de un día. Puedes configurar una política de ciclo de vida de objeto de la siguiente forma:

// lifecycle.json
{
  "lifecycle": {
    "rule":
    [
      {
        "action": {"type": "Delete"},
        "condition": {"age": 1}
      }
    ]
  }
}

Para implementarla, usa el comando gsutil lifecycle set:

gsutil lifecycle set lifecycle.json gs://<your-cloud-storage-bucket>

Ten en cuenta que esto se aplica a todos los archivos del bucket. Por lo tanto, si almacenas copias de seguridad de usuarios importantes que deseas mantener por un largo tiempo junto con fotos que deseas borrar a diario, te recomendamos usar dos depósitos distintos o ejecutar eliminaciones de forma manual con gsutil o tu propio servidor.

Google Cloud Functions (beta)

Google Cloud Functions es una solución de procesamiento ligera, basada en eventos y asíncrona que permite crear funciones pequeñas de un solo propósito que responden a eventos, sin tener que administrar servidores ni entornos de ejecución. Estas funciones se pueden usar para la transcodificación de videos, la clasificación de imágenes con el aprendizaje automático o la sincronización metadatos con la Firebase Realtime Database. Con aún menos sobrecarga que App Engine, Cloud Functions es la forma más rápida de reaccionar a los cambios en Cloud Storage.

API de Google Cloud Vision

La API de Google Cloud Vision encapsula potentes modelos de aprendizaje automático en una API fácil de usar, lo que permite que los desarrolladores conozcan el contenido de una imagen. Clasifica imágenes de forma rápida en miles de categorías, detecta objetos individuales y rostros en las imágenes, detecta y lee palabras impresas en las imágenes, identifica el contenido ofensivo e incluso proporciona un análisis de opiniones de la imagen.

API de Google Cloud Speech

De manera similar a la API de Vision, la API de Google Cloud Speech permite a los desarrolladores extraer texto desde archivos de audio almacenados en Cloud Storage. La API reconoce más de 80 idiomas y variantes, por lo que puedes usarla con tu base de usuarios global. Si se combina con la API de Google Cloud Natural Language, los desarrolladores pueden extraer el texto sin procesar e inferir su significado. Si necesitas un público global, úsala junto con la API de Google Traductor para traducir el texto a más de 90 idiomas.

Google App Engine

Google App Engine es una “plataforma como servicio” que escala la lógica del backend de forma automática en respuesta a la cantidad de tráfico que recibe. Solo debes subir tu código de backend y Google administrará la disponibilidad de tu app, sin necesidad de que aprovisiones o mantengas ningún servidor. App Engine es una forma rápida y fácil de agregar poder de procesamiento o ejecución de confianza a tu aplicación de Firebase.

Si tienes un bucket Cloud Storage predeterminado con el formato de nombre PROJECT_ID.appspot.com, se comparte automáticamente con una app de App Engine en tu proyecto. Esto significa que, si compilas una app de App Engine, puedes usar las APIs de App Engine integradas para compartir datos entre ese bucket y App Engine. Esto es útil para ejecutar codificaciones de audio, transcodificaciones de video y transformaciones de imagen, así como otras tareas de procesamiento intensivo en segundo plano.

Los entornos estándar de Java, Python y Go para App Engine incluyen la API de Images de App Engine (Java | Python | Go), que permite cambiar el tamaño de una imagen, rotarla, girarla y recortarla, además de mostrar una URL de entrega de imagen que permite realizar transformaciones del cliente, de manera similar a Imgix y Cloudinary.

Cuando importes un proyecto existente de Google Cloud, si deseas que algún objeto de App Engine existente esté disponible en Firebase, deberás configurar el control de acceso predeterminado en tus objetos para permitir que Firebase tenga acceso. Para ello, ejecuta el siguiente comando con gsutil:

gsutil -m acl ch -r -u service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://BUCKET_NAME

Consideraciones para archivos Firebase Security Rules y App Engine

Si tienes un bucket Cloud Storage predeterminado con un formato de nombre de *.appspot.com, tu proyecto también tiene una app de App Engine que comparte ese bucket.

Si configuras tu Firebase Security Rules para el acceso público (no autenticado), también harás que los archivos App Engine subidos recientemente sean accesibles públicamente.

Problemas conocidos de Cloud Storage y App Engine

Existen dos casos conocidos en los que no puedes importar tu app de App Engine:

  1. El proyecto contiene una app maestro/esclavo de App Engine Datastore antigua.
  2. El proyecto tiene un ID con un prefijo de dominio, por ejemplo: domain.com:project-1234.

En ambos casos, el proyecto no será compatible con Cloud Storage for Firebase y deberás crear un proyecto de Firebase nuevo para usar Cloud Storage. Si necesitas ayuda, comunícate con el equipo de asistencia.