Integrar com o Google Cloud

O Cloud Storage for Firebase é totalmente integrado ao Google Cloud. Os SDKs do Firebase para Cloud Storage armazenam arquivos diretamente nos buckets do Google Cloud Storage. À medida que o app cresce, outros serviços do Google Cloud podem ser facilmente integrados, como computação gerenciada (por exemplo, o App Engine ou o Cloud Functions) ou APIs de machine learning (por exemplo, Cloud Vision ou Google Tradutor).

Um projeto do Firebase é apenas um projeto do Google Cloud que tem mais configurações e serviços específicos do Firebase ativados para ele. Isso significa que todos os buckets Cloud Storage usados com o Cloud Storage for Firebase são acessíveis em Google Cloud, incluindo o console e as APIs.

A integração com o Google Cloud, incluindo a importação de buckets Cloud Storage atuais, exige um projeto do Firebase no plano de preços do Blaze de pagamento por uso.

Considerações sobre contas de serviço

O Firebase usa contas de serviço do Google Cloud para operar e gerenciar serviços sem compartilhar credenciais de usuário. Ao criar um projeto do Firebase que usa o Cloud Storage, talvez você perceba que uma conta de serviço correspondente já está disponível no projeto: service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com. Para mais informações, consulte Visão geral das contas de serviço do Firebase.

Google Cloud Storage

É possível usar as APIs do Google Cloud Storage para acessar os arquivos enviados pelos SDKs do Firebase para Cloud Storage, principalmente para executar operações mais complexas, como copiar ou mover um arquivo ou listar todos os arquivos disponíveis em uma referência.

É importante observar que essas solicitações usam as opções de controle de acesso do Google Cloud Storage, no lugar de Firebase Authentication e Cloud Storage Security Rules.

APIs

Além dos SDKs do Firebase para Cloud Storage, há várias outras maneiras de acessar os dados armazenados no bucket do Cloud Storage, dependendo do que você quer fazer. Quando você acessa dados em um servidor, oferecemos bibliotecas do lado do servidor, além de uma API RESTful XML compatível com JSON e S3, ou quando você precisa programar alterações ou realizar outras tarefas administrativas, disponibilizamos uma ferramenta de linha de comando muito útil.

SDK de servidor do Google Cloud

O Google Cloud oferece SDKs de servidor de alta qualidade para vários produtos do Google Cloud, incluindo o Cloud Storage. Essas bibliotecas estão disponíveis em Node.js, Java, go, Python, PHP e Ruby.

Para mais informações, incluindo instruções de instalação, autenticação e solução de problemas, consulte a documentação específica da plataforma nos links acima.

Um exemplo de uso para o SDK do Google Cloud Storage é mostrado abaixo:

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 REST

Quando você usa uma linguagem sem biblioteca de cliente, quer executar uma operação indisponível nessas bibliotecas ou tem um cliente HTTP preferido, o Google Cloud Storage oferece APIs para ambos: JSON e XML.

Além dessas APIs de acesso a dados de armazenamento, para gerenciar os buckets do Cloud Storage para uso em projetos do Firebase, use a API Cloud Storage for Firebase.

gsutil

gsutil é uma ferramenta de linha de comando que fornece acesso direto ao Cloud Storage. É possível usar o gsutil para executar uma ampla variedade de tarefas de gerenciamento de bucket e de objetos, incluindo:

  • fazer upload e download e excluir objetos;
  • listar buckets e objetos;
  • mover, copiar e renomear objetos;
  • editar ACLs de objetos e intervalos.

gsutil permitem outras operações avançadas, como mover arquivos de um diretório para outro ou excluir todos os arquivos abaixo de um determinado local.

Para mover todos os arquivos de uma referência a outra, basta usar o recurso da seguinte maneira:

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

Apagar em lote todos os arquivos de uma referência é igualmente 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

Taxas de solicitação

O Google Cloud Storage é um serviço altamente escalonável que usa a tecnologia de escalonamento automático para atingir taxas de solicitação muito altas.

O Google Cloud Storage é um serviço multilocatário. Ou seja, os usuários compartilham o mesmo conjunto de recursos subjacentes. Para aproveitar ao máximo esses recursos compartilhados, os buckets têm uma capacidade inicial de E/S de:

Ao planejar a integração do Cloud Storage for Firebase com o app, considere uma taxa de solicitação mínima que o app precisará para ter um bom desempenho e como fazer solicitações com eficiência. Consulte as diretrizes sobre taxas de solicitação, principalmente como aumentar as taxas de solicitação.

Controle de versão de objeto

Alguma vez você já excluiu algo por acidente e não tinha um backup? O Google Cloud Storage é compatível com controle de versões de objetos, que oferece uma maneira automática de fazer backup de dados e restauração com esses backups. É possível ativar o controle de versões de objetos usando o comando gsutil versioning set:

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

O Cloud Storage sempre usa a versão mais recente. Por isso, se você quer restaurar um objeto, use uma das outras APIs ou ferramentas acima para definir o objeto desejado como o mais recente.

Gerenciamento do ciclo de vida de objetos

O recurso de arquivar ou excluir automaticamente arquivos desatualizados é útil para muitos aplicativos. Felizmente, o Google Cloud Storage oferece o Gerenciamento do ciclo de vida de objetos, que permite apagar ou arquivar objetos após um determinado período.

Suponha que você tenha um app de compartilhamento de fotos e quer que todas as fotos sejam excluídas depois de um dia. Você pode configurar uma política de ciclo de vida do objeto da seguinte maneira:

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

Em seguida, implante-o usando o comando gsutil lifecycle set:

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

Isso se aplica a todos os arquivos do bucket. Portanto, se você estiver armazenando backups de usuários importantes que pretende manter por muito tempo junto com fotos que serão excluídas diariamente, é melhor usar dois buckets separados ou realizar exclusões manualmente com gsutil ou seu próprio servidor.

Google Cloud Functions (Beta)

O Google Cloud Functions é uma solução de computação leve, assíncrona e baseada em eventos que permite criar pequenas funções de finalidade única que respondem a eventos sem a necessidade de gerenciar um servidor ou um ambiente de tempo de execução. Essas funções podem ser usadas para transcodificação de vídeo, classificação de imagens usando machine learning ou sincronização de metadados com o Firebase Realtime Database. Com ainda menos overhead do que o App Engine, o Cloud Functions é o caminho mais rápido para reagir às mudanças no Cloud Storage.

API Google Cloud Vision

A Google Cloud Vision API permite aos desenvolvedores entender o conteúdo de uma imagem por meio do encapsulamento de modelos potentes de aprendizado de máquina em uma API fácil de usar. Ela classifica rapidamente as imagens em milhares de categorias, detecta objetos e rostos, encontra e lê palavras impressas contidas nas imagens, identifica conteúdo ofensivo e fornece até mesmo análise do sentimento da imagem.

API Google Cloud Speech

Do mesmo modo que a API Vision, o API Google Cloud Speech permite aos desenvolvedores extrair texto de um arquivo de áudio armazenado no Cloud Storage. A API reconhece mais de 80 idiomas e variantes para oferecer suporte à sua base global de usuários. Quando combinada com a API Google Cloud Natural Language, além de extrair o texto bruto, o desenvolvedor também consegue inferir o significado do texto. Caso o público seja global, ele poderá usar a API Google Translate e traduzir esse texto para mais de 90 idiomas.

Google App Engine

O Google App Engine é uma plataforma como serviço que faz o escalonamento automático da lógica do back-end em resposta ao volume de tráfego recebido. Basta fazer upload do código do back-end, e o Google vai gerenciar a disponibilidade do app. Não é preciso provisionar nem manter servidores. O App Engine é uma maneira rápida e fácil de adicionar capacidade de processamento extra ou execução confiável ao app do Firebase.

Se você tiver um bucket Cloud Storage padrão com o formato de nome PROJECT_ID.appspot.com, ele será compartilhado automaticamente com um app App Engine no projeto. Isso significa que, se você criar um app do App Engine, poderá usar as APIs App Engine integradas para compartilhar dados entre esse bucket e o App Engine. Isso é útil para executar codificação de áudio, transcodificação de vídeo e transformações de imagem, bem como outros processamentos de computação intensiva em segundo plano.

Os ambientes padrão de Java, Python, e Go para o App Engine incluem a API App Engine Images (Java | Python | Go), que pode redimensionar, girar, virar e cortar uma imagem, além de retornar um URL de exibição de imagem que permite ao cliente fazer transformações, como no Cloudinary e no Imgix.

Para importar um projeto do Google Cloud existente e também disponibilizar objetos existentes do App Engine no Firebase, defina o controle de acesso padrão para que os objetos possam ser acessados pelo Firebase ao executar o seguinte comando via gsutil:

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

Considerações sobre arquivos Firebase Security Rules e App Engine

Se você tiver um bucket Cloud Storage padrão com um formato de nome *.appspot.com, o projeto também terá um app App Engine que compartilha esse bucket.

Se você configurar o Firebase Security Rules para acesso público (não autenticado), os arquivos App Engine enviados recentemente também vão ficar acessíveis publicamente.

Problemas conhecidos para Cloud Storage e App Engine

Há dois casos conhecidos em que não é possível importar o app do App Engine:

  1. O projeto contém um app principal/secundário do App Engine Datastore antigo.
  2. O projeto tem um ID do projeto com prefixo de domínio, por exemplo: domain.com:project-1234.

Em qualquer um desses casos, o projeto não será compatível com o Cloud Storage for Firebase. Você precisa criar um novo projeto do Firebase para usar o Cloud Storage. Fale com o suporte para podermos ajudar você.