Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

クラウドストレージトリガー

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Cloud Storage 内のファイルとフォルダのアップロード、更新、または削除に応じて関数をトリガーできます。

このページの例は、画像ファイルが Cloud Storage にアップロードされたときにトリガーされるサンプル関数に基づいています。このサンプル関数は、イベント属性にアクセスする方法、ファイルを Cloud Functions インスタンスにダウンロードする方法、および Cloud Storage イベントを処理するその他の基本事項を示しています。

ユースケースのその他の例については、「 Cloud Functions で何ができますか?」を参照してください。

Cloud Storage の変更で関数をトリガーする

functions.storage を使用して、Cloud Storage イベントを処理するfunctions.storageを作成します。関数の範囲を特定の Cloud Storage バケットに限定するか、デフォルトのバケットを使用するかに応じて、次のいずれかを使用します。

たとえば、サムネイル ジェネレーターのサンプルは、プロジェクトのデフォルト バケットにスコープが設定されています。

exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage は次のイベントをサポートしています。

  • onArchiveバケットでオブジェクトのバージョニングが有効になっている場合にのみ送信されます。このイベントは、オブジェクトがアーカイブされたか、同じ名前のオブジェクトのアップロードによって上書きされたために、オブジェクトのライブ バージョンがアーカイブ バージョンになったことを示します。
  • onDeleteオブジェクトが完全に削除されたときに送信されます。これには、バケットのライフサイクル構成の一部として上書きまたは削除されたオブジェクトが含まれます。オブジェクトのバージョニングが有効になっているバケットの場合、オブジェクトがアーカイブされるとき ( onArchiveを参照)、 storage.objects.deleteメソッドを介してアーカイブが行われる場合でも、これは送信されません。
  • onFinalize新しいオブジェクト (または既存のオブジェクトの新しい世代) がバケットに正常に作成されたときに送信されます。これには、既存のオブジェクトのコピーまたは書き換えが含まれます。アップロードが失敗しても、このイベントはトリガーされません。
  • onMetadataUpdate既存のオブジェクトのメタデータが変更されたときに送信されます。

上記のonFinalizeのように、 onイベント ハンドラー内でイベントを設定します。

Cloud Storage オブジェクト属性へのアクセス

Cloud Functions は、更新されたファイルのsizecontentTypeなど、多数の Cloud Storage オブジェクト属性を公開します。 「メタジェネレーション」属性は、オブジェクトのメタデータが変更されるたびに増分されます。新しいオブジェクトの場合、 metagenerationの値は1です。

const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

サムネイル生成サンプルでは、​​これらの属性のいくつかを使用して、関数が返す終了ケースを検出します。

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith('image/')) {
  return functions.logger.log('This is not an image.');
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
  return functions.logger.log('Already a Thumbnail.');
}

ファイルのダウンロード、変換、およびアップロード

場合によっては、Cloud Storage からファイルをダウンロードする必要がない場合があります。ただし、Cloud Storage に保存されたファイルからサムネイル画像を生成するなどの集中的なタスクを実行するには、関数インスタンス、つまりコードを実行する仮想マシンにファイルをダウンロードする必要があります。

オブジェクトを Cloud Storage に簡単にダウンロードして再アップロードするには、 npm install --save @google-cloud/storageを使用してGoogle Cloud Storage パッケージをインストールし、インポートします。 JavaScript promise を使用して、サンプルのサムネイル処理タスクなどの外部プロセスを処理するには、 child-process-promiseもインポートします。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');

gcs.bucket.file(filePath).downloadを使用して、ファイルを Cloud Functions インスタンスの一時ディレクトリにダウンロードします。この場所で、必要に応じてファイルを処理し、Cloud Storage にアップロードできます。非同期タスクを実行するときは、コールバックで JavaScript promise を返すようにしてください。

例: 画像変換

Cloud Functions は、グラフィカルな画像ファイルを操作できるImageMagickという画像処理プログラムを提供します。以下は、アップロードされた画像ファイルのサムネイル画像を作成する方法の例です。

// Download file from bucket.
const bucket = admin.storage().bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
  contentType: contentType,
};
await bucket.file(filePath).download({destination: tempFilePath});
functions.logger.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
await spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
functions.logger.log('Thumbnail created at', tempFilePath);
// We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
// Uploading the thumbnail.
await bucket.upload(tempFilePath, {
  destination: thumbFilePath,
  metadata: metadata,
});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
return fs.unlinkSync(tempFilePath);

このコードは、 ImageMagickコマンドライン プログラムconvertを実行して、一時ディレクトリに保存された画像の 200x200 のサムネイルを作成し、Cloud Storage にアップロードして戻します。

他の例を見る

画像のトランスコーディングコンテンツのモデレートEXIF メタデータの抽出など、一般的なメディア変換機能の例をさらに示します。例の完全なリストはGitHub で入手できます。

詳細については、Google Cloud Storage トリガーの完全なドキュメントを参照してください。