Integra Storage a Google Cloud

Cloud Storage para Firebase se integra estrechamente a Google Cloud. Los SDK de Firebase para Cloud Storage almacenan archivos directamente en los buckets de Google Cloud Storage y, a medida que crece la app, puedes integrar fácilmente otros servicios de Google Cloud, por ejemplo, procesamiento administrado con servicios como App Engine o Cloud Functions, o APIs de aprendizaje automático con servicios como Cloud Vision o Google Traductor.

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. Consulta esta guía de asistencia de Firebase para obtener más información.

De forma interna, los SDK de Firebase para Cloud Storage usan el bucket predeterminado en el nivel sin costo de App Engine. Esto te permite comenzar a utilizar Cloud Storage rápidamente, sin necesidad de ingresar una tarjeta de crédito ni habilitar una cuenta de Facturación de Cloud. También te permite compartir datos fácilmente entre Firebase y un proyecto de Google Cloud.

La integración a Google Cloud, incluida la importación de buckets existentes de Cloud Storage, requiere un proyecto de Firebase que tenga el plan Blaze. Obtén más información acerca de los planes en nuestra página de precios.

Google Cloud Storage

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

Es importante que tengas en cuenta que estas solicitudes usan las opciones de control de acceso de Google Cloud Storage en lugar de Firebase Authentication y las reglas de seguridad de Cloud Storage.

API

Además de los SDK de Firebase para Cloud Storage, existen otras formas de acceder a los datos almacenados en tu bucket de Cloud Storage, según lo que desees hacer. Si accedes a los datos en un servidor, te ofrecemos bibliotecas del servidor, al igual que una API de RESTful XML compatible con JSON y S3. Si necesitas ejecutar secuencias de comandos de cambios o realizar otras tareas administrativas, tenemos una herramienta de línea de comandos que te será útil.

SDK de servidores de Google Cloud

Google Cloud ofrece SDK de servidores de alta calidad para diversos productos de nube, incluido 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.

Aquí encontrarás 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 API 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 con alta escalabilidad que usa tecnología de 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 planees integrar Cloud Storage para Firebase en tu app, considera un porcentaje de solicitudes mínimo que necesite la app para tener un buen rendimiento y también cómo realizar 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 los 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 API 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 la Administración del ciclo de vida de los objetos, que te permite borrar o archivar objetos después de 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.

App Engine

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.

Los SDK de Firebase para Cloud Storage usan el bucket predeterminado de App Engine, por lo que, si compilas una aplicación de App Engine, puedes usar las API integradas de esta plataforma para compartir datos entre Firebase 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 y Python), 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 a Firebase, 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 a fin de permitir que Firebase tenga acceso. Para ello, ejecuta el siguiente comando con gsutil:

gsutil -m acl ch -r -u service-<project number;gt@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://<your-cloud-storage-bucket>

Problemas conocidos

Existen dos casos conocidos en los que no puedes importar tu aplicación de App Engine:

  1. El proyecto contiene una app maestro/esclavo antigua de App Engine Datastore.
  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 para Firebase y deberás crear un proyecto nuevo de Firebase para usar Cloud Storage. Si necesitas ayuda, comunícate con el equipo de asistencia.

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 pueden usarse para transcodificar videos, clasificar imágenes con el aprendizaje automático o sincronizar metadatos con 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.