Eseguire l'integrazione con Google Cloud

Cloud Storage for Firebase è perfettamente integrato con Google Cloud. Gli SDK Firebase per Cloud Storage archiviano i file direttamente nei Google Cloud Storage bucket, e man mano che la tua app cresce, puoi integrare altri servizi Google Cloud, come il calcolo gestito come App Engine o Cloud Functions, o le API di machine learning come Cloud Vision o Google Translate.

Un progetto Firebase è in realtà solo un progetto Google Cloud con configurazioni e servizi aggiuntivi specifici di Firebase abilitati. Ciò significa che ogni Cloud Storage bucket che utilizzi con Cloud Storage for Firebase è accessibile in Google Cloud (inclusa la console e le API).

Considerazioni per i service account

Firebase utilizza i service account Google Cloud per 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 service account corrispondente: service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com. Per saperne di più, consulta la panoramica dei service account Firebase.

Google Cloud Storage

Puoi utilizzare le Google Cloud Storage API 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 opzioni di Google Cloud Storage 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 ciò che vuoi fare. Se accedi ai dati su un server, offriamo librerie lato server, nonché un'API RESTful JSON e XML compatibile con S3. Se devi scrivere script per le modifiche o eseguire altre attività amministrative, abbiamo uno strumento a riga di comando che ti sarà utile.

Google Cloud SDK server

Google Cloud offre SDK 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, incluse le istruzioni di installazione, l'autenticazione e la risoluzione dei problemi, consulta la documentazione specifica della piattaforma collegata sopra.

Di seguito è riportato un esempio di utilizzo dell'Google Cloud Storage SDK:

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 fare qualcosa che le librerie client non fanno o hai semplicemente un client HTTP preferito che preferisci utilizzare, Google Cloud Storage offre API sia per JSON che 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 un'ampia gamma di attività di gestione di bucket e oggetti, tra cui:

  • Caricare, scaricare ed eliminare oggetti.
  • Elencare bucket e oggetti.
  • Spostare, copiare e rinominare oggetti.
  • Modificare le ACL di oggetti e bucket.

gsutil consente altre operazioni avanzate, come spostare file da una directory all'altra o eliminare tutti i file in una determinata posizione.

Spostare tutti i file da un riferimento all'altro è facile come:

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

L'eliminazione in batch di tutti i file in 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

Tassi di richieste

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

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

Quando pianifichi di integrare Cloud Storage for Firebase nella tua app, pensa a un tasso di richieste minimo di cui la tua app ha bisogno per prestazioni ottimali e a come effettuare le richieste in modo efficiente. Consulta le linee guida sui tassi di richieste, e, in particolare, sull'aumento graduale dei tassi di richieste.

Controllo delle versioni degli oggetti

Ti è mai capitato di eliminare qualcosa per errore e di non avere 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 abilitare il controllo delle versioni degli oggetti utilizzando il comando gsutil versioning set:

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

Cloud Storage seleziona sempre la versione più recente, quindi se vuoi ripristinare un oggetto, devi utilizzare una delle altre API o degli altri strumenti sopra indicati per impostare l'oggetto desiderato come il 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 fornisce 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 in cui vuoi che tutte le foto vengano eliminate entro un giorno. Puoi configurare un criterio del ciclo di vita degli oggetti nel seguente modo:

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

Eseguine il deployment utilizzando il comando gsutil lifecycle set:

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

Tieni presente che questa impostazione si applica a tutti i file nel bucket, quindi se archivi backup utente importanti che vuoi conservare a lungo insieme alle foto che vuoi eliminare ogni giorno, potresti utilizzare due bucket separati o eseguire le eliminazioni manualmente con gsutil o il tuo server.

Google Cloud Functions (beta)

Google Cloud Functions è una soluzione di calcolo basata sugli eventi asincrona e leggera che ti consente di creare piccole funzioni a uso specifico in grado di rispondere agli eventi senza la necessità di gestire un ambiente server o di runtime. Queste funzioni possono essere utilizzate per la transcodifica di video, la classificazione di immagini utilizzando il machine learning o la sincronizzazione dei 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 semplice da utilizzare. Classifica rapidamente le immagini in migliaia di categorie, rileva singoli oggetti e volti all'interno delle immagini, trova e legge le parole stampate contenute nelle immagini, identifica i 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, gli sviluppatori possono estrarre il testo non elaborato e dedurre il significato di quel testo. Se è necessario un pubblico globale, combinala con l' API Google Translate per tradurre il testo in oltre 90 lingue.

Google App Engine

Cloud Storage for Firebase utilizza due formati di denominazione diversi per i bucket predefiniti a seconda di quando hai creato il bucket:

  • Bucket predefinito creato dopo settembre 2024: *.firebasestorage.app i bucket predefiniti sono indipendenti da Google App Engine.
  • Bucket predefiniti legacy: *.appspot.com i bucket predefiniti sono condivisi con 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. Carica il codice di backend e Google gestirà la disponibilità della tua app. Non devi eseguire il provisioning o la manutenzione dei server. App Engine è un modo rapido e semplice per aggiungere ulteriore potenza di elaborazione o esecuzione attendibile a tua applicazione Firebase.

Integrazione legacy App Engine

Se hai un bucket predefinito legacy *.appspot.com, questo viene condiviso automaticamente con un'app App Engine nel tuo progetto. Ciò significa che puoi utilizzare le API App Engine integrate per condividere i dati tra il bucket e App Engine. Questa funzionalità è utile per eseguire la codifica audio, la transcodifica video e le trasformazioni delle immagini, nonché altre elaborazioni in background ad alta intensità di calcolo.

Gli ambienti standard Java, Python e Go per App Engine includono l'API Images App Engine (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, simili a Cloudinary e Imgix.

Considerazioni sui bucket condivisi

Se utilizzi il bucket predefinito legacy *.appspot.com:

  • Firebase Security Rules e file App Engine: i file caricati utilizzando App Engine condividono lo stesso bucket e sono soggetti alle stesse configurazioni di sicurezza. Se configuri i tuoi Firebase Security Rules per l'accesso pubblico, renderai accessibili pubblicamente anche i file App Engine appena caricati.

  • Impostazione delle autorizzazioni: quando importi un progetto esistente inGoogle Cloud Firebase, potresti dover impostare il controllo dell'accesso predefinito sugli oggetti per consentire a Firebase di accedervi. Esegui il seguente comando utilizzando gsutil:

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

Problemi noti per Cloud Storage e App Engine

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

  • Il progetto contiene un'app App Engine Datastore Master/Slave precedente.

  • Il progetto ha un ID progetto con prefisso di dominio, ad esempio: domain.com:project-1234.

In entrambi questi casi, il progetto non supporterà Cloud Storage for Firebase, e dovrai creare un nuovo progetto Firebase per utilizzare Cloud Storage. In caso di domande, contatta l'assistenza Firebase.