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 プロジェクトを作成すると、対応するサービス アカウント(
)がプロジェクトですでに利用可能である場合があります。
詳細については、Firebase サービス アカウントの概要をご覧ください。
Google Cloud Storage
Google Cloud Storage API を使用すると、Cloud Storage 用の Firebase SDK 経由でアップロードされたファイルにアクセスできます。特に、ファイルのコピーと移動、参照で使用可能なすべてのファイルの列挙など、より複雑な操作を実行できます。
これらのリクエストでは、Firebase Authentication と Cloud 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.js、Java、Go、Python、PHP、Ruby で使用できます。
インストール手順、認証、トラブルシューティングを含む詳細については、上記のリンク先のプラットフォーム固有のドキュメントをご覧ください。
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 と XML 用の両方の 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
App Engine 向けの Java、Python、Go の各スタンダード環境には、App Engine Images API(Java、Python、Go)が含まれています。これを使用すれば、画像のサイズ変更、回転、反転、切り取りに加えて、画像配信 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
公開(未認証)アクセス用に Firebase Security Rules を構成すると、新しくアップロードされた App Engine ファイルも一般公開されます。
Cloud Storage と App Engine の既知の問題
次の 2 つのケースで App Engine アプリをインポートできないことがわかっています。
- プロジェクトに以前の App Engine Datastore Master/Slave アプリが含まれている。
- ドメインの接頭辞が付いたプロジェクト ID(たとえば
domain.com:project-1234
)がプロジェクトに設定されている。
いずれの場合も、このプロジェクトは Cloud Storage for Firebase に対応していません。また、Cloud Storage を使用するには、新しい Firebase プロジェクトを作成する必要があります。支援が必要な場合は、サポートにお問い合わせください。