與 Google Cloud 整合

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

Firebase 專案其實就是Google Cloud專案,只是啟用了一些 Firebase 專屬的設定和服務。也就是說,您在 Cloud Storage for Firebase 中使用的每個 Cloud Storage 儲存空間,都可以在 Google Cloud 中存取 (包括控制台和 API)。

整合 Google Cloud (包括匯入現有 Cloud Storage bucket) 時,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 存取透過 Cloud StorageFirebase SDK 上傳的檔案,特別是執行更複雜的作業,例如複製或移動檔案,或是列出參照中所有可用的檔案。

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

API

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

Google Cloud 伺服器 SDK

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

如需更多資訊,包括安裝說明、驗證和疑難排解,請參閱上方連結的平台專屬說明文件。

以下是 Google Cloud Storage SDK 的使用範例:

    // 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) {});
    
    // 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();
    
    // 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)
    }
    
    # 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()
    
    // 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');
    
    # 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 值區,可以使用 Cloud Storage for Firebase API

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 容量為:

規劃在應用程式中整合 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 APICloud Storage 儲存的音訊檔案中擷取文字。這個 API 可辨識超過 80 種語言和方言,滿足全球各地使用者的需求。搭配 Google Cloud Natural Language API 使用時,開發人員可以擷取原始文字,並推斷該文字的意義。如要觸及全球觀眾,請搭配使用 Google Translate API,將文字翻譯成 90 多種語言。

Google App Engine

Google App Engine 是一種「平台即服務」,可根據接收的流量自動調度後端邏輯。您只要上傳後端程式碼,Google 就會為您管理應用程式的可用性,不必佈建或維護伺服器。App Engine 可快速且直接地為 Firebase 應用程式新增額外的處理能力或可信執行作業。

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

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

將現有 Google Cloud 專案匯入 Firebase 時,如要讓現有 App Engine 物件在 Firebase 中可用,請設定物件的預設存取權控管,允許 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 Master/Slave 應用程式。
  2. 專案的專案 ID 前面加上網域,例如:domain.com:project-1234

在上述任一情況下,專案都不支援 Cloud Storage for Firebase,因此您應建立新的 Firebase 專案,才能使用 Cloud Storage。請聯絡支援團隊,我們會為你提供協助。