Google Cloud と統合する

Cloud Storage for FirebaseGoogle Cloud と緊密に統合されています。Cloud Storage 用の Firebase SDK は、Google Cloud Storage バケットにファイルを直接保存します。アプリの成長に合わせて、App Engine や Cloud Functions などのマネージド コンピューティング、Cloud Vision や Google 翻訳などの ML API など、他の Google Cloud サービスを統合できます。

Google Cloud プロジェクトは、実際には Google Cloud プロジェクトであり、追加の Firebase 固有の構成とサービスが有効になっています。つまり、Cloud Storage for Firebase で使用するすべての Cloud Storage バケットに Google Cloud からアクセスできます(コンソールと API を含む)。

Google Cloud との統合(既存の Cloud Storage バケットのインポートなど)には、従量制の Blaze 料金プランの Firebase プロジェクトが必要です。

サービス アカウントに関する考慮事項

Firebase では、ユーザー認証情報を共有せずに、Google Cloud サービス アカウントを使用してサービスの操作と管理を行えます。Cloud Storage を使用する Firebase プロジェクトを作成すると、対応するサービス アカウント(service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com)がプロジェクトですでに利用可能である場合があります。 詳細については、Firebase サービス アカウントの概要をご覧ください。

Google Cloud Storage

Google Cloud Storage API を使用すると、Cloud Storage 用の Firebase SDK 経由でアップロードされたファイルにアクセスできます。特に、ファイルのコピーと移動、参照で使用可能なすべてのファイルの列挙など、より複雑な操作を実行できます。

これらのリクエストでは、Firebase AuthenticationCloud Storage Security Rules ではなく、Google Cloud Storage アクセス制御オプションが使用されることに注意してください。

API

Cloud Storage 用の Firebase SDK のほかにも、目的に応じて Cloud Storage バケットに保存されているデータにアクセスする方法がいくつかあります。サーバー上のデータにアクセスする場合は、サーバーサイド ライブラリに加えて、JSON および S3 互換の XML RESTful API が用意されています。変更をスクリプト化したり、その他の管理タスクを実行する必要がある場合は、便利なコマンドライン ツールがあります。

Google Cloud サーバー SDK

Google Cloud は、Cloud Storage などのさまざまなクラウド プロダクト用の高品質なサーバー SDK を提供しています。これらのライブラリは、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 StorageJSONXML 用の両方の 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 に備わっているオブジェクトのライフサイクル管理を使用すると、一定時間が経過したオブジェクトを削除またはアーカイブできます。

写真共有アプリケーションで、すべての写真を 1 日以内に削除する必要があるとします。次のようにオブジェクト ライフサイクル ポリシーをセットアップできます。

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

gsutil lifecycle set コマンドを使用してこれをデプロイします。

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

なお、バケット内のすべてのファイルにこれが適用されるため、毎日削除すべき写真と一緒に、長期間残しておきたい重要なユーザー バックアップを保存している場合には、2 つのバケットを個別に使用するか、gsutil または独自のサーバーを使って手動で削除を実行することができます。

Google Cloud Functions(ベータ版)

Google Cloud Functions は軽量、イベントベース、かつ非同期のコンピュート ソリューションです。クラウド イベントに応答できる、単一目的の小規模な関数を作成することができます。サーバーやランタイム環境を管理する必要はありません。これらの関数を使用して、動画のコード変換、機械学習を使用した画像の分類、またはメタデータと Firebase Realtime Database の同期を行うことができます。App Engine よりもオーバーヘッドが小さい Cloud Functions は、Cloud Storage の変化に対応する最速の方法です。

Google Cloud Vision API

デベロッパーは Google Cloud Vision 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 アプリケーションの処理能力や信頼性を高める迅速かつシンプルな方法です。

名前の形式が PROJECT_ID.appspot.com のデフォルトの Cloud Storage バケットがある場合、そのバケットはプロジェクト内の App Engine アプリと自動的に共有されます。つまり、App Engine アプリをビルドする場合は、組み込みの App Engine API を使用して、そのバケットと App Engine の間でデータを共有できます。これは、自動エンコード、動画のコード変換、画像変換、その他の計算集中型のバックグラウンド処理に役に立ちます。

App Engine 向けの Java、Python、Go の各スタンダード環境には、App Engine Images API(JavaPythonGo)が含まれています。これを使用すれば、画像のサイズ変更、回転、反転、切り取りに加えて、画像配信 URL を返すことで、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 Rules ファイルと App Engine ファイルの考慮事項

名前の形式が *.appspot.com のデフォルトの Cloud Storage バケットがある場合、プロジェクトにはそのバケットを共有する App Engine アプリもあります。

公開(未認証)アクセス用に Firebase Security Rules を構成すると、新しくアップロードされた App Engine ファイルも一般公開されます。

Cloud StorageApp Engine の既知の問題

次の 2 つのケースで App Engine アプリをインポートできないことがわかっています。

  1. プロジェクトに以前の App Engine Datastore Master/Slave アプリが含まれている。
  2. ドメインの接頭辞が付いたプロジェクト ID(たとえば domain.com:project-1234)がプロジェクトに設定されている。

いずれの場合も、このプロジェクトは Cloud Storage for Firebase に対応していません。また、Cloud Storage を使用するには、新しい Firebase プロジェクトを作成する必要があります。支援が必要な場合は、サポートにお問い合わせください。