Integracja z Google Cloud

Usługa Cloud Storage for Firebase jest ściśle zintegrowana z Google Cloud. Pakiety Firebase SDK dla Cloud Storage przechowują pliki bezpośrednio w Google Cloud Storage zasobnikach. W miarę rozwoju aplikacji możesz integrować inne usługi Google Cloud, takie jak usługa zarządzanego przetwarzania, np. App Engine lub Cloud Functions, lub interfejsy API do uczenia maszynowego, np. Cloud Vision czy Google Translate.

Projekt Firebase to tak naprawdę projekt Google Cloud z włączonymi dodatkowymi konfiguracjami i usługami Firebase. Oznacza to, że każdy folder Cloud Storage, którego używasz w Cloud Storage for Firebase, jest dostępny w Google Cloud (w tym konsola i interfejsy API).

Integracja z Google Cloud, w tym importowanie istniejących Cloud Storage bucketów, wymaga projektu Firebase korzystającego z abonamentu Blaze z opłatami według wykorzystania.

Informacje o kontach usługi

Firebase używa Google Cloudkont usługi do obsługi i zarządzania usługami bez udostępniania danych logowania użytkownika. Gdy utworzysz projekt Firebase, który korzysta z Cloud Storage, możesz zauważyć, że odpowiednie konto usługi jest już dostępne w projekcie:service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com. Więcej informacji znajdziesz w artykule Omówienie kont usługi Firebase.

Google Cloud Storage

Możesz używać interfejsów API Google Cloud Storage, aby uzyskać dostęp do plików przesłanych za pomocą pakietów SDK Firebase dla Cloud Storage, zwłaszcza w celu wykonywania bardziej złożonych operacji, takich jak kopiowanie lub przenoszenie pliku czy wyświetlanie listy wszystkich plików dostępnych w odnośniku.

Pamiętaj, że te prośby używają Google Cloud Storage opcji kontroli dostępu, a nie Firebase Authentication ani Cloud Storage Security Rules.

Interfejsy API

Oprócz pakietów SDK Firebase do usługi Cloud Storage istnieje wiele innych sposobów uzyskiwania dostępu do danych przechowywanych w zasobach Cloud Storage, w zależności od tego, co chcesz zrobić. Jeśli chcesz uzyskać dostęp do danych na serwerze, oferujemy biblioteki po stronie serwera, a także interfejs JSON i interfejs XML RESTful API zgodny z S3. Jeśli chcesz wprowadzić zmiany w skryptach lub wykonać inne zadania administracyjne, możesz skorzystać z naszego narzędzia wiersza poleceń.

Google Cloud pakiety SDK serwera

Firma Google Cloud oferuje wysokiej jakości pakiety SDK serwera dla wielu usług Google Cloud, w tym Cloud Storage. Te biblioteki są dostępne w Node.js, Java, Go, Python, PHPRuby.

Więcej informacji, w tym instrukcje instalacji, uwierzytelniania i rozwiązywania problemów, znajdziesz w powyżej wymienionej dokumentacji dotyczącej danej platformy.

Poniżej znajdziesz przykład użycia pakietu 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}"
    

Interfejs API typu REST

Jeśli używasz języka, dla którego nie ma biblioteki klienta, chcesz wykonać działanie, którego nie obsługują biblioteki klienta lub po prostu masz ulubionego klienta HTTP, którego wolisz używać, Google Cloud Storage oferuje interfejsy API zarówno dla JSON, jak i XML.

Oprócz tych interfejsów API dostępu do danych możesz też używać interfejsu Cloud Storage for Firebase API do zarządzania zasobnikami Cloud Storage w projektach Firebase.

gsutil

gsutil to narzędzie wiersza poleceń, które zapewnia bezpośredni dostęp do usługi Cloud Storage. Za pomocą gsutil możesz wykonywać wiele zadań związanych z zarządzaniem zasobnikami i obiektami, takich jak:

  • przesyłać, pobierać i usuwać obiekty;
  • Wyświetlanie zasobników i obiektów.
  • przenoszenie, kopiowanie i zmienianie nazw obiektów;
  • edytować listy kontroli dostępu obiektów i zasobników.

gsutil umożliwiają wykonywanie innych zaawansowanych operacji, takich jak przenoszenie plików z jednego katalogu do drugiego czy usuwanie wszystkich plików z określonej lokalizacji.

Przenoszenie wszystkich plików z jednego odwołania do drugiego jest bardzo proste:

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

Usuwanie wszystkich plików pod referencją w grupie jest równie proste:

# 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

Prośby o stawki

Google Cloud Storage to usługa o wysokiej skalowalności, która korzysta z technologii autoskalowania w celu osiągnięcia bardzo wysokiej szybkości przetwarzania żądań.

Google Cloud Storage to usługa wielodzierżawcza, co oznacza, że użytkownicy korzystają z tych samych zasobów. Aby jak najlepiej wykorzystać te współdzielone zasoby, zbiorniki mają początkową pojemność we/wy.

Planując integrację Cloud Storage for Firebase z aplikacją, zastanów się nad minimalną częstotliwością żądań, jakiej potrzebuje aplikacja, aby zapewnić dobrą wydajność, oraz nad efektywnością wysyłania żądań. Zapoznaj się z wytycznymi dotyczącymi częstotliwości wysyłania żądań, a zwłaszcza z zwiększaniem częstotliwości wysyłania żądań.

Obsługa wersji obiektów

Czy zdarzyło Ci się kiedyś usunąć coś przez przypadek, nie mając kopii zapasowej? Google Cloud Storage obsługuje obsługę wersji obiektów, która umożliwia automatyczne tworzenie kopii zapasowych danych i przywracanie ich z tych kopii. Obsługę wersji obiektów możesz włączyć za pomocą polecenia gsutil versioning set:

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

Cloud Storage zawsze pobiera najnowszą wersję, więc jeśli chcesz przywrócić obiekt, musisz użyć jednego z wymienionych wyżej interfejsów API lub narzędzi, aby ustawić wybrany obiekt jako najnowszy.

Zarządzanie cyklem życia obiektu

Możliwość automatycznego archiwizowania lub usuwania nieaktualnych plików jest przydatną funkcją w wielu zastosowaniach. Na szczęście Google Cloud Storage udostępnia zarządzanie cyklem życia obiektów, które pozwala usuwać lub archiwizować obiekty po określonym czasie.

Wyobraź sobie, że chcesz usunąć wszystkie zdjęcia z aplikacji do udostępniania zdjęć w ciągu 1 dnia. Aby skonfigurować zasady cyklu życia obiektu, wykonaj te czynności:

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

Wdróż je za pomocą polecenia gsutil lifecycle set:

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

Pamiętaj, że dotyczy to wszystkich plików w zasobniku, więc jeśli przechowujesz ważne kopie zapasowe użytkowników, które chcesz przechowywać przez długi czas, obok zdjęć, które chcesz usuwać codziennie, możesz użyć 2 oddzielnych zasobników lub usunąć pliki ręcznie za pomocą gsutil lub własnego serwera.

Google Cloud Functions (beta)

Google Cloud Functions to wymagające niewielu zasobów rozwiązanie oparte na zdarzeniach i obliczeniach asynchronicznych. Umożliwia ono tworzenie niewielkich funkcji realizujących jeden cel i reagujących na zdarzenia bez konieczności zarządzania serwerem lub środowiskiem wykonawczym. Te funkcje można stosować do transkodowania wideo, klasyfikowania obrazów za pomocą uczenia maszynowego lub synchronizowania metadanych za pomocą funkcji Firebase Realtime Database. Cloud Functions to najszybszy sposób na reagowanie na zmiany w App Engine, ponieważ wymaga jeszcze mniej zasobów niż App Engine.Cloud Storage

Google Cloud Vision API

Interfejs Google Cloud Vision API umożliwia deweloperom analizowanie treści obrazu dzięki umieszczeniu zaawansowanych modeli systemów uczących się w prostym interfejsie API. Szybko klasyfikuje obrazy w tysiące kategorii, wykrywa poszczególne obiekty i twarze na obrazach, znajduje i czyta słowa zawarte na obrazach, identyfikuje obraźliwe treści, a nawet przeprowadza analizę nastroju obrazu.

Google Cloud Speech API

Podobnie jak interfejs Vision API, Google Cloud Speech API umożliwia deweloperom wyodrębnianie tekstu z pliku audio przechowywanego w Cloud Storage. Interfejs API rozpoznaje ponad 80 języków i wariantów, aby obsługiwać globalne grono użytkowników. W połączeniu z interfejsem Google Cloud Natural Language API deweloperzy mogą wyodrębniać tekst źródłowy i wyciągać z niego znaczenie. Jeśli chcesz dotrzeć do odbiorców na całym świecie, możesz połączyć tę funkcję z interfejsem Google Translate API, aby przetłumaczyć tekst na ponad 90 języków.

Google App Engine

Google App Engine to „platforma jako usługa”, która automatycznie skaluje logikę zaplecza w odpowiedzi na ilość otrzymywanego ruchu. Wystarczy przesłać kod backendu, a Google będzie zarządzać dostępnością aplikacji. Nie musisz udostępniać ani obsługiwać żadnych serwerów. App Engine to szybki i prosty sposób na zwiększenie mocy obliczeniowej lub zaufane wykonywanie kodu w aplikacji Firebase.

Jeśli masz domyślny zasób Cloud Storage o nazwie w formacie PROJECT_ID.appspot.com, jest on automatycznie udostępniany aplikacji App Engine w Twoim projekcie. Oznacza to, że jeśli tworzysz aplikację App Engine, możesz używać wbudowanych interfejsów API App Engine, aby udostępniać dane między tym zasobnikiem a App Engine. Jest to przydatne w przypadku kodowania dźwięku, transkodowania wideo i przekształcania obrazów, a także innych procesów w tle wymagających dużej mocy obliczeniowej.

Standardowe środowiska w Javie, Pythonie i Go, które obejmują interfejs API App Engine Images (Java | Python | Go), umożliwiają zmianę rozmiaru, obracanie, przekręcanie i przycinanie obrazu, a także zwracanie adresu URL służącego do wyświetlania obrazu. Umożliwia to przekształcenia po stronie klienta, podobne do tych w Cloudinary i Imgix.App Engine

Jeśli chcesz zaimportować istniejący projekt Google Cloud do Firebase i uzyskać dostęp do istniejących obiektów App Engine w Firebase, musisz ustawić domyślną kontrolę dostępu do tych obiektów, aby umożliwić Firebase uzyskanie do nich dostępu. Aby to zrobić, uruchom ten polecenie za pomocą gsutil:

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

Informacje dotyczące plików Firebase Security Rules i App Engine

Jeśli masz domyślny zasób Cloud Storage o nazwie *.appspot.com, Twój projekt ma też aplikację App Engine, która korzysta z tego zasobnika.

Jeśli skonfigurujesz Firebase Security Rules na dostęp publiczny (nieautoryzowany), nowo przesłane pliki App Engine będą również publicznie dostępne.

Znane problemy dotyczące Cloud Storage i App Engine

Istnieją 2 znane przypadki, w których nie możesz zaimportować aplikacji App Engine:

  1. Projekt zawiera aplikację App Engine Datastore Master/Slave.
  2. Projekt ma identyfikator z prefiksem domeny, np. domain.com:project-1234.

W obu przypadkach projekt nie będzie obsługiwał funkcji Cloud Storage for Firebase. Aby korzystać z funkcji Cloud Storage, musisz utworzyć nowy projekt Firebase. Skontaktuj się z zespołem pomocy, aby uzyskać pomoc.