Google Cloud と統合する

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

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

また、Cloud Storage 用 Firebase SDK は、App Engine 無料枠にあるデフォルトのバケットを使用します。そのため、クレジット カード番号を入力したり、Cloud 請求先アカウントを有効にしたりすることなく、Cloud Storage をすばやく起動し、実行することができます。また、Firebase と Google Cloud プロジェクトの間でデータを簡単に共有することもできます。

Google Cloud との統合には、Blaze プラン上の Firebase プロジェクトが必要です。既存の Cloud Storage バケットをインポートする場合にも必要です。プランの詳細については、料金体系ページをご覧ください。

Google Cloud Storage

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

これらのリクエストでは、Firebase Authentication および Cloud Storage セキュリティ ルールではなく、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 Storage が JSON API と XML API の両方の 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 または独自のサーバーを使って手動で削除を実行することができます。

App Engine

App Engine は、受信したトラフィック量に応じてバックエンド ロジックを自動的にスケールする Platform as a Service です。バックエンド コードをアップロードするだけで、Google がアプリの利用可能性を管理するため、サーバーを準備したり、維持したりする必要がありません。App Engine は、Firebase アプリケーションの処理能力や信頼性を高める迅速かつ簡単な方法です。

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

App Engine 向けの Java、Python、Go の各スタンダード環境には、App Engine Images API(JavaPython)が含まれています。これを使用すれば、画像のサイズ変更、回転、反転、切り取りに加えて、画像配信 URL を返すことで、Cloudinary や Imgix と同様のクライアント側変換が可能になります。

既存の Google Cloud プロジェクトを Firebase にインポートするとき、既存の App Engine オブジェクトを Firebase で使用可能にするには、オブジェクトのデフォルトのアクセス制御を Firebase からのアクセスを許可する設定にする必要があります。そのためには gsutil を使って次のコマンドを実行します。

gsutil -m acl ch -r -u service-<project number;gt@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://<your-cloud-storage-bucket>

既知の問題

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

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

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

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 を超える言語にテキストを翻訳します。