Eseguire l'integrazione con Google Cloud

Cloud Storage for Firebase è strettamente integrato con Google Cloud. Gli SDK Firebase per Cloud Storage memorizza i file direttamente nei bucket Google Cloud Storage, e man mano che la tua app cresce, puoi integrare altri servizi Google Cloud, come l'elaborazione gestita come App Engine o Cloud Functions, o API di machine learning come Cloud Vision o Google Traduttore.

Un progetto Firebase è in realtà solo un progetto Google Cloud per il quale sono stati attivati configurazioni e servizi aggiuntivi specifici di Firebase. Ciò significa che ogni bucket Cloud Storage che utilizzi con Cloud Storage for Firebase è accessibile in Google Cloud (incluse la console e le API).

L'integrazione con Google Cloud, inclusa l'importazione dei bucket Cloud Storageesistenti, richiede un progetto Firebase con il piano tariffario Blaze con pagamento a consumo.

Considerazioni per gli account di servizio

Firebase utilizza gli account di servizio Google Cloud per operare e gestire i servizi senza condividere le credenziali utente. Quando crei un progetto Firebase che utilizza Cloud Storage, potresti notare che nel progetto è già disponibile un account di servizio corrispondente: service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com. Per saperne di più, consulta la panoramica degli account di servizio Firebase.

Google Cloud Storage

Puoi utilizzare le API Google Cloud Storage per accedere ai file caricati tramite gli SDK Firebase per Cloud Storage, in particolare per eseguire operazioni più complesse, come copiare o spostare un file o elencare tutti i file disponibili in un riferimento.

È importante notare che queste richieste utilizzano le Google Cloud Storage opzioni di controllo dell'accesso, anziché Firebase Authentication e Cloud Storage Security Rules.

API

Oltre agli SDK Firebase per Cloud Storage, esistono diversi altri modi per accedere ai dati archiviati nel bucket Cloud Storage, a seconda di cosa vuoi fare. Se accedi ai dati su un server, offriamo librerie lato server, nonché un'API RESTful XML compatibile con JSON e S3. Se invece hai bisogno di eseguire script di modifica o altre attività amministrative, abbiamo uno strumento a riga di comando che ti tornerà utile.

SDK di server Google Cloud

Google Cloud offre SDK di server di alta qualità per una serie di prodotti cloud, tra cui Cloud Storage. Queste librerie sono disponibili in Node.js, Java, Go, Python, PHP, e Ruby.

Per ulteriori informazioni, tra cui istruzioni di installazione, autenticazione e risoluzione dei problemi, consulta la documentazione specifica della piattaforma disponibile al link sopra.

Di seguito è riportato un esempio di utilizzo dell'SDK 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 REST

Se utilizzi un linguaggio senza una libreria client, vuoi eseguire un'operazione non supportata dalle librerie client o preferisci utilizzare un client HTTP preferito, Google Cloud Storage offre API sia per JSON sia per XML.

Oltre a queste API di accesso ai dati di archiviazione, per gestire i bucket Cloud Storage da utilizzare nei progetti Firebase puoi utilizzare l'API Cloud Storage per Firebase.

gsutil

gsutil è uno strumento a riga di comando che ti consente di accedere direttamente a Cloud Storage. Puoi utilizzare gsutil per eseguire una vasta gamma di attività di gestione di bucket e oggetti, tra cui:

  • Caricamento, download ed eliminazione di oggetti.
  • Elenco di bucket e oggetti.
  • Spostamento, copia e ridenominazione di oggetti.
  • Modifica degli ACL di oggetti e bucket.

gsutil consentono altre operazioni avanzate, come lo spostamento di file da una directory all'altra o l'eliminazione di tutti i file sotto una determinata posizione.

Per spostare tutti i file da un riferimento all'altro, è sufficiente:

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

L'eliminazione collettiva di tutti i file sotto un riferimento è altrettanto intuitiva:

# 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

Tariffe per le richieste

Google Cloud Storage è un servizio altamente scalabile che utilizza la tecnologia di scalabilità automatica per raggiungere tassi di richiesta molto elevati.

Google Cloud Storage è un servizio multi-tenant, il che significa che gli utenti condividono lo stesso insieme di risorse di base. Per utilizzare al meglio queste risorse condivise, i bucket hanno una capacità IO iniziale.

Quando pianifichi di integrare Cloud Storage for Firebase nella tua app, tieni conto della frequenza minima di richieste di cui ha bisogno la tua app per un buon rendimento e di come effettuare le richieste in modo efficiente. Consulta le linee guida sui tassi di richieste, in particolare sull'aumento graduale dei tassi di richieste.

Controllo delle versioni degli oggetti

Hai mai eliminato qualcosa per errore e non avevi un backup? Google Cloud Storage supporta il controllo delle versioni degli oggetti, che fornisce un modo automatico per eseguire il backup dei dati e ripristinarli da questi backup. Puoi attivare il controllo delle versioni degli oggetti utilizzando il comando gsutil versioning set:

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

Cloud Storage recupera sempre la versione più recente, quindi se vuoi recuperare un oggetto, devi utilizzare una delle altre API o degli altri strumenti sopra indicati per impostare l'oggetto desiderato come quello più recente.

Gestione del ciclo di vita degli oggetti

La possibilità di archiviare o eliminare automaticamente i file obsoleti è una funzionalità utile per molte applicazioni. Fortunatamente, Google Cloud Storage offre la gestione del ciclo di vita degli oggetti, che ti consente di eliminare o archiviare gli oggetti dopo un determinato periodo di tempo.

Considera un'applicazione di condivisione di foto per la quale vuoi che tutte le foto vengano eliminate entro un giorno. Puoi configurare un criterio del ciclo di vita degli oggetti come segue:

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

Esegui il deployment utilizzando il comando gsutil lifecycle set:

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

Tieni presente che questo vale per tutti i file del bucket, quindi se accanto ai backup utente importanti che vuoi conservare per molto tempo memorizzi foto che vuoi eliminare ogni giorno, ti consigliamo di utilizzare due bucket distinti o di eseguire le eliminazioni manualmente con gsutil o con il tuo server.

Google Cloud Functions (beta)

Google Cloud Functions è una soluzione di calcolo asincrona e leggera, basata su eventi che ti consente di creare piccole funzioni monouso che rispondono agli eventi senza la necessità di gestire un server o un ambiente di runtime. Queste funzioni possono essere utilizzate per transcodificare i video, classificare le immagini utilizzando il machine learning o sincronizzare i metadati con Firebase Realtime Database. Con un overhead ancora inferiore rispetto a App Engine, Cloud Functions è il modo più rapido per reagire alle modifiche in Cloud Storage.

Google Cloud Vision API

L'API Google Cloud Vision consente agli sviluppatori di comprendere i contenuti di un'immagine integrando efficaci modelli di machine learning in un'API facile da usare. Classifica rapidamente le immagini in migliaia di categorie, rileva singoli oggetti e volti all'interno delle immagini, trova e legge le parole stampate all'interno delle immagini, identifica contenuti offensivi e fornisce persino l'analisi del sentiment delle immagini.

API Google Cloud Speech

Analogamente all'API Vision, l'API Google Cloud Speech consente agli sviluppatori di estrarre il testo da un file audio archiviato in Cloud Storage. L'API riconosce oltre 80 lingue e varianti per supportare la tua base utenti globale. Se combinata con l'API Google Cloud Natural Language, consente agli sviluppatori di estrarre il testo non elaborato e di dedurre il significato del testo. Se hai bisogno di un pubblico globale, abbina questa funzionalità all'API Google Traduttore per tradurre il testo in oltre 90 lingue.

Google App Engine

Google App Engine è una "piattaforma come servizio" che scala automaticamente la logica di backend in risposta alla quantità di traffico che riceve. Basta caricare il codice di backend e Google gestirà la disponibilità della tua app. Non ci sono server da eseguire il provisioning o la manutenzione. App Engine è un modo rapido e semplice per aggiungere potenza di elaborazione o esecuzione attendibile alla tua applicazione Firebase.

Se hai un bucket Cloud Storage predefinito con il formato del nome PROJECT_ID.appspot.com, viene condiviso automaticamente con un'app App Engine nel tuo progetto. Ciò significa che se crei un'app App Engine, puoi utilizzare le API App Engine integrate per condividere i dati tra quel bucket e App Engine. Questa opzione è utile per eseguire la codifica audio, la transcodifica video e le trasformazioni delle immagini, nonché altri tipi di elaborazione in background ad alta intensità di calcolo.

Gli ambienti standard Java, Python e Go per App Engine includono l'API App Engine Images (Java | Python | Go), che può ridimensionare, ruotare, capovolgere e ritagliare un'immagine, nonché restituire un URL di pubblicazione dell'immagine che consente trasformazioni lato client, in modo simile a Cloudinary e Imgix.

Quando importi un progetto Google Cloud esistente in Firebase, se vuoi rendere disponibili in Firebase gli oggetti App Engine esistenti, devi impostare il controllo di accesso predefinito sui tuoi oggetti per consentire a Firebase di accedervi eseguendo il seguente comando utilizzando gsutil:

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

Considerazioni per i file Firebase Security Rules e App Engine

Se hai un bucket Cloud Storage predefinito con un formato del nome di *.appspot.com, il tuo progetto ha anche un'app App Engine che condivide quel bucket.

Se configuri Firebase Security Rules per l'accesso pubblico (non autenticato), anche i file App Engine appena caricati saranno accessibili pubblicamente.

Problemi noti per Cloud Storage e App Engine

Esistono due casi noti in cui non puoi importare l'app App Engine:

  1. Il progetto contiene una precedente app App Engine Datastore Master/Slave.
  2. Il progetto ha un ID progetto con un dominio predefinito, ad esempio: domain.com:project-1234.

In entrambi i casi, il progetto non supporterà Cloud Storage for Firebase e dovrai creare un nuovo progetto Firebase per poter utilizzare Cloud Storage. Contatta l'assistenza per consentirci di aiutarti.