與 Google Cloud 整合

Cloud Storage for FirebaseGoogle Cloud 緊密整合。Firebase 適用於 Cloud Storage 的 SDK 會直接將檔案儲存在 Google Cloud Storage 儲存體中,隨著應用程式成長,您可以整合其他 Google Cloud 服務,例如 App Engine 或 Cloud Functions 等受管理的運算服務,或是 Cloud Vision 或 Google Translate 等機器學習 API。

Firebase 專案其實就是 Google Cloud 專案,只是啟用了其他 Firebase 專屬設定和服務。這表示您在 Cloud Storage for Firebase 中使用 Cloud Storage 時,每個資料夾都可以在 Google Cloud 中存取 (包括控制台和 API)。

如要整合 Google Cloud (包括匯入現有的 Cloud Storage 儲存桶),Firebase 專案必須採用即付即用 Blaze 定價方案

服務帳戶的考量因素

Firebase 會使用 Google Cloud 服務帳戶運作及管理服務,而無須分享使用者憑證。建立使用 Cloud Storage 的 Firebase 專案時,您可能會發現專案中已提供對應的服務帳戶:service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com。詳情請參閱「Firebase 服務帳戶總覽」。

Google Cloud Storage

您可以使用 Google Cloud Storage API 存取透過 Firebase SDK 上傳至 Cloud Storage 的檔案,特別是執行更複雜的作業,例如複製或移動檔案,或列出參照中可用的所有檔案。

請注意,這些要求會使用 Google Cloud Storage 存取權控管選項,而非 Firebase AuthenticationCloud Storage Security Rules

API

除了 Cloud StorageFirebase SDK 外,您還可以透過多種其他方式存取儲存在 Cloud Storage 儲存桶中的資料,具體取決於您要執行的操作。如果您要存取伺服器上的資料,我們提供伺服器端程式庫,以及與 JSON 和 S3 相容的 XML RESTful API。如果您需要編寫變更指令碼或執行其他管理作業,我們也提供實用的指令列工具。

Google Cloud 伺服器 SDK

Google Cloud 為多項雲端產品提供高品質的伺服器 SDK,包括 Cloud Storage。這些程式庫適用於 Node.jsJavagoPythonPHPRuby

如需進一步瞭解安裝說明、驗證和疑難排解等資訊,請參閱上方連結的特定平台說明文件。

以下是 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}"
    

REST API

如果您使用的是沒有用戶端程式庫的語言、想執行用戶端程式庫無法執行的操作,或是只想使用偏好的 HTTP 用戶端,Google Cloud Storage 提供 JSONXML 的 API。

除了這些儲存資料存取 API 之外,您也可以使用 Firebase 專用 Cloud Storage API,管理用於 Firebase 專案的 Cloud Storage 值區。

gsutil

gsutil 是一項指令列工具,可讓您直接存取 Cloud Storage。您可以使用 gsutil 執行多種值區和物件管理工作,包括:

  • 上傳、下載及刪除物件。
  • 列出值區和物件。
  • 移動、複製及重新命名物件。
  • 編輯物件和值區 ACL。

gsutil 可執行其他進階作業,例如將檔案從一個目錄移動到另一個目錄,或刪除特定位置下方的所有檔案。

將所有檔案從一個參照移至另一個參照,只要執行以下操作即可:

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

刪除參考檔案下方的所有檔案也同樣簡單:

# 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

要求費率

Google Cloud Storage 是一項可高度擴充的服務,採用自動調整資源配置技術,能有效達到極高的要求比率。

Google Cloud Storage 屬於多用戶群服務,意思是多個使用者要共用同一組基礎資源。為了充分利用這些共用資源,值區的初始 IO 容量為 1000 次寫入要求/秒 (包括上傳、更新和刪除物件) 以及 5000 次讀取要求/秒。

當您打算將 Cloud Storage for Firebase 整合至應用程式時,請考量應用程式需要達到哪個最小要求率才能獲得良好效能,以及如何有效提出要求。請詳閱有關要求率的規範,尤其是提高要求率

物件版本管理

你是否曾經不小心刪除某些內容,但沒有備份?Google Cloud Storage 支援物件版本管理,可自動備份資料,並從這些備份還原資料。您可以使用 gsutil versioning set 指令啟用物件版本管理功能:

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

Cloud Storage 一律會選取最新版本,因此如果您想還原物件,就必須使用上述其他 API 或工具,將所需物件設為最新版本。

物件生命週期管理

自動封存或刪除過時檔案的功能對許多應用程式來說都很實用。幸好,Google Cloud Storage 提供物件生命週期管理功能,可讓您在特定時間後刪除或封存物件。

假設您希望相片分享應用程式在一天內刪除所有相片,您可以按照下列步驟設定物件生命週期政策:

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

然後使用 gsutil lifecycle set 指令進行部署:

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

請注意,這項設定適用於值區中的所有檔案。因此,如果您要儲存需要長期保留的重要使用者備份,以及要每天刪除的相片,建議您使用兩個不同的值區,或透過 gsutil 或您自己的伺服器手動刪除檔案。

Google Cloud Functions (Beta 版)

Google Cloud Functions 是依事件執行的簡易非同步運算解決方案,可讓您建立單一用途的小型函式來回應事件,完全不須管理伺服器或執行階段環境。這些函式可用於轉碼影片、使用機器學習技術分類圖片,或將中繼資料與 Firebase Realtime Database 同步。Cloud Functions 的額外負擔比 App Engine 更低,是因應 Cloud Storage 變更的最佳方式。

Google Cloud Vision API

Google Cloud Vision API 可讓開發人員在簡單好用的 API 中封裝功能強大的機器學習模型,藉此瞭解圖片內容。這個 API 能將圖片快速分成數千種類別、偵測圖片內的個別物件和臉孔、尋找與讀取圖片中的印刷文字、識別攻擊性內容,甚至提供圖片情緒分析。

Google Cloud Speech API

與 Vision API 類似,Google Cloud Speech API 可讓開發人員從儲存在 Cloud Storage 中的音訊檔案中擷取文字。這個 API 可辨識超過 80 種語言和方言,滿足全球各地使用者的需求。搭配使用 Google Cloud Natural Language API 後,開發人員就能擷取原始文字,並推斷該文字的意義。如果需要全球觀眾,請搭配使用 Google Translate API,將文字翻譯成 90 多種語言。

Google App Engine

Google App Engine 是「Platform as a Service」,可根據收到的流量自動調整後端邏輯。只要上傳後端程式碼,Google 就會為您管理應用程式的可用性,您不需要佈建或維護伺服器。App Engine 是為 Firebase 應用程式新增額外處理能力或可信執行作業的快速簡單方法。

如果您有預設 Cloud Storage 值區,其名稱格式為 PROJECT_ID.appspot.com,則會自動與專案中的 App Engine 應用程式共用。也就是說,如果您建構 App Engine 應用程式,可以使用內建的 App Engine API,在該值區和 App Engine 之間分享資料。這項功能可用於執行音訊編碼、影片轉碼和圖片轉換,以及其他需要大量運算資源的背景處理作業。

App Engine 的 Java、Python 和 Go 標準環境包含 App Engine Images API (Java | Python | Go),可用於調整圖片大小、旋轉、翻轉和裁剪圖片,以及傳回可進行用戶端轉換的圖片服務網址,類似於 Cloudinary 和 Imgix。

將現有的 Google Cloud 專案匯入 Firebase 時,如果您想在 Firebase 中提供任何現有的 App Engine 物件,就必須為物件設定預設存取權控管,以便 Firebase 透過 gsutil 執行下列指令來存取這些物件:

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

Firebase Security RulesApp Engine 檔案的注意事項

如果您有預設 Cloud Storage 值區,其名稱格式為 *.appspot.com,則您的專案也包含共用該值區的 App Engine 應用程式。

如果您將 Firebase Security Rules 設定為公開 (未驗證) 存取權,則新上傳的 App Engine 檔案也會變成可公開存取的檔案。

Cloud StorageApp Engine 的已知問題

目前已知有兩種情況會導致您無法匯入 App Engine 應用程式:

  1. 專案包含舊版 App Engine Datastore 主/從應用程式。
  2. 專案具有網域前置專案 ID,例如:domain.com:project-1234

無論是哪種情況,專案都不會支援 Cloud Storage for Firebase,因此您必須建立新的 Firebase 專案才能使用 Cloud Storage。請與支援團隊聯絡,我們會盡力提供協助。