Eseguire l'integrazione con Google Cloud

Cloud Storage for Firebase è strettamente integrato con Google Cloud. Gli SDK Firebase per Cloud Storage memorizzano i file direttamente nei bucket Google Cloud Storage 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 API di machine learning come Cloud Vision o Google Translate.

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

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

Considerazioni per i service account

Firebase utilizza i service account per gestire i servizi senza condividere le credenziali utente.Google Cloud Quando crei un progetto Firebase che utilizza Cloud Storage, potresti notare che un account di servizio corrispondente è già disponibile nel tuo progetto: 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 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 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 creare script per le modifiche o eseguire altre attività amministrative, abbiamo uno strumento a riga di comando che ti sarà utile.

SDK server Google Cloud

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 istruzioni di installazione, autenticazione e risoluzione dei problemi, consulta la documentazione specifica della piattaforma collegata 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 fare qualcosa che le librerie client non fanno o hai semplicemente un client HTTP preferito che preferisci utilizzare, Google Cloud Storage offre API per JSON e 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 for 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:

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

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

Spostare tutti i file da un riferimento a un altro è semplicissimo:

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

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à I/O iniziale.

Quando pianifichi di integrare Cloud Storage for Firebase nella tua app, pensa a una frequenza di richieste minima di cui la tua app ha bisogno per un buon rendimento e a come effettuare le richieste in modo efficiente. Consulta le linee guida sulle frequenze delle richieste, in particolare sull'aumento graduale delle frequenze delle 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 il ripristino 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 ripristinare un oggetto, devi utilizzare una delle altre API o uno 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.

Prendi in considerazione un'applicazione di condivisione di foto che 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}
      }
    ]
  }
}

E distribuiscilo utilizzando il comando gsutil lifecycle set:

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

Tieni presente che questa operazione si applica a tutti i file nel bucket, quindi se memorizzi backup importanti degli utenti che vuoi conservare a lungo termine insieme a foto che vuoi eliminare quotidianamente, ti consigliamo di utilizzare due bucket separati o di eseguire le eliminazioni manualmente con gsutil o il tuo server.

Google Cloud Functions (beta)

Google Cloud Functions è una soluzione di calcolo asincrona, leggera e basata su eventi che ti consente di creare piccole funzioni monouso in grado di rispondere agli eventi senza la necessità di gestire un server o un ambiente di runtime. Queste funzioni possono essere utilizzate per transcodificare video, classificare 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 i singoli oggetti e i 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 del testo. Se è necessario un pubblico globale, combinalo con l'API Google Translate 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. Ti basta caricare il codice di backend e Google gestirà la disponibilità della tua app. Non dovrai eseguire il provisioning o la manutenzione di alcun server. App Engine è un modo rapido e semplice per aggiungere ulteriore 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, questo 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 questo bucket e App Engine. È 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 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 dell'accesso predefinito sugli 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 *.appspot.com, il tuo progetto ha anche un'app App Engine che condivide quel bucket.

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

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 prefisso di dominio, 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 utilizzare Cloud Storage. Contatta l'assistenza per ricevere aiuto.