Firebase Realtime Database トリガー
Cloud Run functions を使用すると、関数と同じ Google Cloud プロジェクトで Firebase Realtime Database 内のイベントを処理できます。Cloud Run functions では、完全な管理者権限を使用してデータベース オペレーションを実行できます。また、データベースに対する個々の変更がそれぞれ別個に処理されます。Firebase Realtime Database の変更は、Firebase Admin SDK で行うことができます。
一般的なライフサイクルの場合、Firebase Realtime Database の関数は以下のように機能します。
特定のデータベースに変更が加えられるのを待ちます。
イベントが発生するとトリガーされ、そのタスクを実行します。
指定されたドキュメントに保存されているデータのスナップショットを含むデータ オブジェクトを受け取ります。
イベントタイプ
関数を使用して、2 つのレベルの特性でデータベース イベントを処理できます。作成イベント、更新イベントまたは削除イベントのみリッスンすることも、パスに対するあらゆる種類の変更をリッスンすることもできます。Cloud Run functions は、Realtime Database で次のイベントタイプをサポートしています。
イベントタイプ | トリガー |
---|---|
providers/google.firebase.database/eventTypes/ref.write |
任意のミューテーション イベントでトリガーされます。Realtime Database 内でデータが作成、更新、削除されるとトリガーされます。 |
providers/google.firebase.database/eventTypes/ref.create (デフォルト) |
Realtime Database で新しいデータが作成されるとトリガーされます。 |
providers/google.firebase.database/eventTypes/ref.update |
Realtime Database でデータが更新されるとトリガーされます。 |
providers/google.firebase.database/eventTypes/ref.delete |
Realtime Database からデータが削除されるとトリガーされます。 |
データベース パスとインスタンスの指定
関数がトリガーされるタイミングと場所を制御するには、パスを指定する必要があります。必要であれば、データベース インスタンスも指定します。
パス
パスを指定すると、そのパスに関係するすべての書き込みが比較対象となります。指定したパスの下にある任意の場所で発生する書き込みも対象に含まれます。関数のパスを /foo/bar
として設定すると、次の場所のイベントはいずれもマッチ対象となります。
/foo/bar
/foo/bar/baz/really/deep/path
どちらの場合も、Firebase ではイベントが /foo/bar
で発生したと解釈され、イベントデータには /foo/bar
の古いデータと新しいデータが含まれます。イベントデータが大きい場合は、データベースのルート付近で単一の関数を使用する代わりに、より深いパスで複数の関数を使用することを検討してください。最高のパフォーマンスを得るには、できるだけ深いレベルのデータのみを要求するようにします。
パス コンポーネントは、中かっこで囲むことでワイルドカードとして指定できます。foo/{bar}
は /foo
のすべての子と一致します。このワイルドカード パス コンポーネントの値は、関数の event.params
オブジェクト内で使用できます。この例では、値は event.params.bar
として使用可能になります。
ワイルドカードを含むパスは、1 つの書き込みの複数のイベントに一致する場合があります。次の挿入を見てみましょう。
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
これはパス /foo/{bar}
と 2 回一致します。1 回目は "hello": "world"
で、2 回目は "firebase": "functions"
です。
インスタンス
Google Cloud コンソールを使用する場合は、データベース インスタンスを指定する必要があります。
Google Cloud CLI を使用する場合は、インスタンスを --trigger-resource
文字列の一部として指定する必要があります。
たとえば、以下では --trigger-resource
文字列で次が使用されます。
--trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/PATH
イベントの構造
Realtime Database イベントが処理されると、data
オブジェクトには 2 つのプロパティが JSON オブジェクト形式で含まれます。
data
: 関数をトリガーしたイベントの前に取得されたデータのスナップショット。delta
: 関数をトリガーしたイベントの後に取得されたデータのスナップショット。
コードサンプル
Node.js
Python
Go
Java
C#
Ruby
PHP
関数のデプロイ
次の gcloud コマンドは、パス /messages/{pushId}/original
の create
イベントによってトリガーされる関数をデプロイします。
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --entry-point ENTRY_POINT \ --trigger-event providers/google.firebase.database/eventTypes/ref.create \ --trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/messages/{pushId}/original \ --runtime RUNTIME
引数 | 説明 |
---|---|
FUNCTION_NAME |
デプロイする Cloud Run 関数の登録名。ソースコード内の関数の名前にすることも、任意の文字列にすることもできます。FUNCTION_NAME が任意の文字列の場合は、--entry-point フラグを含める必要があります。 |
--entry-point ENTRY_POINT |
ソースコード内の関数またはクラスの名前。FUNCTION_NAME を使用して、デプロイ時に実行する関数をソースコードに指定していない場合は省略できます。それ以外の場合は、--entry-point を使用して実行可能関数の名前を指定する必要があります。 |
--trigger-event NAME |
関数が受信するイベントタイプの名前。この場合、write、create、update、delete のいずれかになります。 |
--trigger-resource NAME |
関数がリッスンするデータベース パスの完全修飾名。次の形式に従う必要があります。
projects/_/instances/DATABASE_INSTANCE/refs/PATH |
--runtime RUNTIME |
使用しているランタイムの名前。網羅的なリストについては、gcloud リファレンスをご覧ください。 |