Google Cloud Firestore トリガー(第 1 世代)
Cloud Run functions は、関数と同じ Google Cloud プロジェクトの Firestore 内のイベントを処理できます。これらのイベントの発生時に、Firestore API とクライアント ライブラリを使用して Firestore の読み取りや更新を行うことができます。
一般的なライフサイクルの場合、Firestore の関数は次のように動作します。
特定のドキュメントに変更が加えられるのを待ちます。
イベントが発生するとトリガーされ、そのタスクを実行します。
影響を受けるドキュメントのスナップショットを含むデータ オブジェクトを受信します。
write
またはupdate
イベントの場合、トリガー イベントの前後のドキュメントの状態を表すスナップショットがデータ オブジェクトに含まれます。
イベントタイプ
Firestore は、create
、update
、delete
、write
イベントをサポートしています。write
イベントには、ドキュメントに対するすべての変更が含まれます。
イベントタイプ | トリガー |
---|---|
providers/cloud.firestore/eventTypes/document.create (デフォルト) |
ドキュメントが最初に書き込まれたときにトリガーされます。 |
providers/cloud.firestore/eventTypes/document.update |
すでに存在するドキュメントの値が変更されたときにトリガーされます。 |
providers/cloud.firestore/eventTypes/document.delete |
データを含むドキュメントが削除されたときにトリガーされます。 |
providers/cloud.firestore/eventTypes/document.write |
ドキュメントが作成、更新、削除されたときにトリガーされます。 |
ワイルドカードは、次のように中括弧で記述します。
"projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}"
ドキュメント パスの指定
関数をトリガーするには、リッスンするドキュメント パスを指定します。関数はドキュメントの変更にのみ対応します。特定のフィールドまたはコレクションをモニタリングすることはできません。有効なドキュメント パスは次のとおりです。
users/marie
: 有効なトリガー。1 つのドキュメント(/users/marie
)をモニタリングします。users/{username}
: 有効なトリガー。すべてのユーザー ドキュメントをモニタリングします。コレクション内のすべてのドキュメントをモニタリングする場合は、ワイルドカードを使用します。users/{username}/addresses
: 無効なトリガー。ドキュメントではなく、サブコレクションaddresses
を参照します。users/{username}/addresses/home
: 有効なトリガー。すべてのユーザーの自宅住所のドキュメントをモニタリングします。users/{username}/addresses/{addressId}
: 有効なトリガー。すべての住所ドキュメントをモニタリングします。
ワイルドカードとパラメータの使用
モニタリングするドキュメントがわからない場合は、ドキュメント ID の代わりに {wildcard}
を使用します。
users/{username}
は、すべてのユーザー ドキュメントに対する変更をリッスンします。
この例では、users
にあるドキュメントの任意のフィールドが変更されると、{username}
というワイルドカードと照合されます。
users
に含まれるドキュメントにサブコレクションがある場合、サブコレクションのいずれかに含まれるドキュメントのフィールドが変更されても、{username}
ワイルドカードはトリガーされません。
ワイルドカードに一致した部分が、ドキュメント パスから抽出されます。明示的なコレクションまたはドキュメント ID に置き換えるワイルドカードは、必要な数だけ定義できます。
イベントの構造
このトリガーは、次のようなイベントで関数を呼び出します。
{ "oldValue": { // Update and Delete operations only A Document object containing a pre-operation document snapshot }, "updateMask": { // Update operations only A DocumentMask object that lists changed fields. }, "value": { // A Document object containing a post-operation document snapshot } }
それぞれの Document
オブジェクトに 1 つまたは複数の Value
オブジェクトが含まれます。型の詳細については、Value
ドキュメントをご覧ください。これは、Go などの型言語を使用して関数を記述する場合に便利です。
コードサンプル
以下の Cloud Functions の関数のサンプルでは、トリガーする Cloud Firestore イベントのフィールドを出力します。
Node.js
Python
Go
Java
C#
Ruby
PHP
次の例では、ユーザーが追加した値を取得し、その場所にある文字列を大文字に変換して、値を大文字の文字列に置き換えています。
Node.js
Python
Go
Java
C#
Ruby
PHP
関数のデプロイ
次の gcloud
コマンドは、ドキュメント /messages/{pushId}
に対する書き込みイベントによってトリガーされる関数をデプロイします。
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --entry-point ENTRY_POINT \ --runtime RUNTIME \ --set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID \ --trigger-event "providers/cloud.firestore/eventTypes/document.write" \ --trigger-resource "projects/YOUR_PROJECT_ID/databases/(default)/documents/messages/{pushId}"
引数 | 説明 |
---|---|
FUNCTION_NAME |
デプロイする Cloud Functions の関数の登録名。ソースコード内の関数の名前にすることも、任意の文字列にすることもできます。FUNCTION_NAME が任意の文字列の場合は、--entry-point フラグを含める必要があります。 |
--entry-point ENTRY_POINT |
ソースコード内の関数またはクラスの名前。FUNCTION_NAME を使用して、デプロイ時に実行する関数をソースコードに指定していない場合は省略できます。その場合は、--entry-point を使用して実行可能関数の名前を指定する必要があります。 |
--runtime RUNTIME |
使用しているランタイムの名前。網羅的なリストについては、gcloud リファレンスをご覧ください。 |
--set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID |
ランタイム環境変数としてのプロジェクトの固有識別子。 |
--trigger-event NAME |
関数がモニタリングするイベントタイプ(write 、create 、update または delete )。 |
--trigger-resource NAME |
関数がリッスンするデータベース パスの完全修飾名。次の形式に従う必要があります。
"projects/YOUR_PROJECT_ID/databases/(default)/documents/PATH"
{pushId} テキストは、ドキュメント パスの指定で説明したワイルドカード パラメータです。 |
制限事項
Cloud Run functions の Firestore トリガーには、次の制限事項があります。
- Cloud Run functions(第 1 世代)では、Firestore ネイティブ モードの既存の「(デフォルト)」データベースがあることが前提となります。Firestore の名前付きデータベースや Datastore モードはサポートされていません。これらを使用している場合にイベントを構成するには、Cloud Run functions(第 2 世代)を使用してください。
- 順序は保証されません。短時間に複数の変更を行うと、予期しない順序で関数の呼び出しがトリガーされることがあります。
- イベントは必ず 1 回以上処理されますが、1 つのイベントで関数が複数回呼び出される場合があります。「正確に 1 回」のメカニズムに依存することは避け、べき等になるように関数を記述してください。
- Datastore モードの Firestore には、Cloud Run functions(第 2 世代)が必要です。Cloud Run functions(第 1 世代)では、Datastore モードはサポートされていません。
- セッションは、単一のデータベースに関連付けられます。複数のデータベースに一致するトリガーは作成できません。
- データベースを削除しても、そのデータベースのトリガーは自動的に削除されません。トリガーはイベントの配信を停止しますが、トリガーを削除するまで存在し続けます。
- 一致したイベントが最大リクエスト サイズを超えると、Cloud Run functions(第 1 世代)に配信されない可能性があります。
- リクエスト サイズが原因で配信されなかったイベントは、プラットフォーム ログに記録され、プロジェクトのログ使用量にカウントされます。
- これらのログは、ログ エクスプローラで「サイズが第 1 世代の上限を超えているため、イベントを Cloud Functions に配信できません...」という
error
重大度メッセージとともに表示されます。関数名はfunctionName
フィールドで確認できます。receiveTimestamp
フィールドが現在から 1 時間以内であれば、タイムスタンプの前後のスナップショットで問題のドキュメントを読み取ることで、実際のイベントの内容を推測できます。 - このようなケイデンスを回避するには、次のようにします。
- Cloud Run functions(第 2 世代)への移行とアップグレードを行う
- ドキュメントのサイズを縮小する
- 問題の Cloud Run functions を削除する
- 除外を使用してロギング自体を無効にすることもできますが、問題のあるイベントは引き続き配信されないことに注意してください。