Cloud Storage 内のファイルとフォルダのアップロード、更新、または削除に応じて関数をトリガーできます。
このページの例は、画像ファイルが Cloud Storage にアップロードされたときにトリガーされるサンプル関数に基づいています。このサンプル関数は、イベント属性にアクセスする方法、ファイルを Cloud Functions インスタンスにダウンロードする方法、および Cloud Storage イベントを処理するその他の基本事項を示しています。
ユースケースのその他の例については、「 Cloud Functions で何ができますか?」を参照してください。
Cloud Storage の変更で関数をトリガーする
functions.storage を使用して、Cloud Storage イベントを処理するfunctions.storage
を作成します。関数の範囲を特定の Cloud Storage バケットに限定するか、デフォルトのバケットを使用するかに応じて、次のいずれかを使用します。
-
functions.storage.object()
を使用して、デフォルトの Cloud Storage バケットでオブジェクトの変更をリッスンします。 -
functions.storage.bucket('bucketName').object()
を使用して、特定のバケットでのオブジェクトの変更をリッスンします。
たとえば、サムネイル ジェネレーターのサンプルは、プロジェクトのデフォルト バケットにスコープが設定されています。
exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage は次のイベントをサポートしています。
-
onArchive
バケットでオブジェクトのバージョニングが有効になっている場合にのみ送信されます。このイベントは、オブジェクトがアーカイブされたか、同じ名前のオブジェクトのアップロードによって上書きされたために、オブジェクトのライブ バージョンがアーカイブ バージョンになったことを示します。 -
onDelete
オブジェクトが完全に削除されたときに送信されます。これには、バケットのライフサイクル構成の一部として上書きまたは削除されたオブジェクトが含まれます。オブジェクトのバージョニングが有効になっているバケットの場合、オブジェクトがアーカイブされるとき (onArchive
を参照)、storage.objects.delete
メソッドを介してアーカイブが行われる場合でも、これは送信されません。 -
onFinalize
新しいオブジェクト (または既存のオブジェクトの新しい世代) がバケットに正常に作成されたときに送信されます。これには、既存のオブジェクトのコピーまたは書き換えが含まれます。アップロードが失敗しても、このイベントはトリガーされません。 -
onMetadataUpdate
既存のオブジェクトのメタデータが変更されたときに送信されます。
上記のonFinalize
のように、 on
イベント ハンドラー内でイベントを設定します。
Cloud Storage オブジェクト属性へのアクセス
Cloud Functions は、更新されたファイルのsize
やcontentType
など、多数の 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 トリガーの完全なドキュメントを参照してください。