Cloud Storage 内のファイルやフォルダのアップロード、更新、削除に応じて、ファンクションをトリガーできます。
このページでは画像ファイルが Cloud Storage にアップロードされたときにトリガーされるサンプル ファンクションに基づいて説明を行っています。このサンプル ファンクションは、イベント属性にアクセスする方法、ファイルを Cloud Functions インスタンスにダウンロードする方法、Cloud Storage イベントの処理に関するその他の基礎知識を示しています。
その他の使用例については、Cloud Functions で可能な処理をご覧ください。
Cloud Storage の変更でファンクションをトリガーする
functions.storage を使用して、Cloud Storage イベントを処理するファンクションを作成します。ファンクションのスコープを特定の Cloud Storage バケットにするか、デフォルトのバケットを使用するかに応じて、次のいずれかを使用します。
functions.storage.object()。デフォルトのストレージ バケットでオブジェクトの変更をリッスンします。functions.storage.bucket('bucketName').object()。特定のバケットでオブジェクトの変更をリッスンします。
たとえば、サムネイルを生成するサンプルは、プロジェクトのデフォルトのバケットをスコープとします。
exports.generateThumbnail = functions.storage.object().onFinalize((object) => { // ...
});
Cloud Storage は、次のイベントをサポートしています。
onArchive。バケットでオブジェクトのバージョニングが有効になっている場合にのみ送信されます。このイベントは、アーカイブまたは同じ名前のオブジェクトのアップロードにより、オブジェクトのライブ バージョンがアーカイブ バージョンになったことを表します。onDelete。オブジェクトが完全に削除された場合に送信されます。バケットのライフサイクル構成で上書きまたは削除されたオブジェクトも対象になります。オブジェクトのバージョニングが有効になっているバケットの場合、オブジェクトがアーカイブされたときに、このイベントは送信されません(onArchiveを参照)。storage.objects.deleteメソッドでアーカイブが行われた場合も同様です。onFinalize。バケットで新しいオブジェクト(または既存オブジェクトの新しい世代)が正常に作成された場合に送信されます。既存のオブジェクトをコピーまたは再作成した場合にも送信されます。アップロードが失敗した場合、このイベントはトリガーされません。onMetadataUpdate。既存オブジェクトのメタデータが変更された場合に送信されます。
onFinalize について上で示したように、on イベント ハンドラ内でイベントを設定します。
Storage オブジェクトの属性にアクセスする
Cloud Functions は、更新されたファイルの size や contentType など、Storage オブジェクトのいくつかの属性を公開します。イベントの resourceState 属性の値は、"exists"(オブジェクトの作成と更新の場合)または "not_exists"(オブジェクトの削除と移動の場合)のいずれかになります。オブジェクトが作成されたばかりかどうかを確認するには、resourceState 属性と metageneration 属性を組み合わせて使用します。metageneration 属性は、オブジェクトのメタデータが変更されるたびに増分されます。新しいオブジェクトの場合、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/')) {
console.log('This is not an image.');
return null;
}
// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
console.log('Already a Thumbnail.');
return null;
}
ファイルをダウンロード、変換、アップロードする
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 gcs = require('@google-cloud/storage')();
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 = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
contentType: contentType,
};
return bucket.file(filePath).download({
destination: tempFilePath,
}).then(() => {
console.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
return spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
}).then(() => {
console.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.
return bucket.upload(tempFilePath, {
destination: thumbFilePath,
metadata: metadata,
});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
}).then(() => fs.unlinkSync(tempFilePath));
このコードは、ImageMagick コマンドライン プログラム convert を実行し、一時ディレクトリに保存された画像のサムネイル(200x200)を作成し、それを Cloud Storage にアップロードして戻します。
その他の例
画像のコード変換、コンテンツのモデレート、EXIF メタデータの抽出など、一般的なメディア変換ファンクションの例も用意しています。その他の例の全一覧は、GitHub をご覧ください。
詳しくは、Google Cloud Storage のトリガーについてのドキュメントをご覧ください。

