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

カスタムイベントトリガーを作成して処理する

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

Cloud Functions (第 2 世代) を使用すると、カスタム イベントに応答して関数をトリガーできます。これらは、Firebase SDK for Cloud Functions によってネイティブにサポートされている Firebase イベントとは対照的に、特別なまたは追加のイベント プロバイダーによって提供されるイベントです。カスタム イベント トリガーを介して、アプリは Firebase Extensions によって提供されるイベントに応答できます。また、独自のカスタム イベントを公開して、それらに応答して関数をトリガーすることもできます。

すべてのカスタム イベントはCloudEvents JSON イベント形式に準拠し、 Eventarcに発行されます。 Eventarc の使用料がかかります。

カスタム イベントで関数をトリガーする

カスタム イベントを公開 (または Firebase 拡張機能からイベントを取得) し、これらのイベントに応答して関数をトリガーするには、次の基本的なフローを実装します。

  1. 目的のイベントを Eventarc チャネルに発行するか、インストールした拡張機能によって提供される使用可能なイベントを特定します。
  2. 関数コードで、 onCustomEventPublishedハンドラーを使用して Eventarc チャネルのイベントをサブスクライブします。
  3. この関数では、CloudEvent オブジェクトで返されたペイロードを解析し、アプリに必要なカスタム ロジックを実行します。

たとえば、ゲーム アプリでは、上位 10 位の競合他社のリーダーボードにユーザーが入ったり出たりしたときに、ユーザーに通知を送信することができます。このアプリは、リーダーボード イベントをデフォルト チャネルに発行し、対象を絞ったプッシュ通知をユーザーに送信する関数でイベントを処理できます。

別の例では、アプリが大きな画像を処理できるように設計された拡張機能が、画像のサイズ変更の完了時にイベントを発行する場合があります。この拡張機能がインストールされているアプリは、アプリ内のリンクを更新して、サイズ変更されたバージョンの画像を指すようにすることで、完了イベントを処理できます。

イベントをチャネルに発行する

Eventarc イベントはチャネルに公開されます。チャネルは、関連するイベントをグループ化し、アクセス許可を管理する方法です。拡張機能をインストールするか、カスタム イベントを使用する関数をデプロイすると、Firebase はus-central1 firebaseに firebase という名前のデフォルト チャネルを自動的に作成します。 Firebase Admin SDK は、チャネルに公開するためのeventarcサブパッケージを提供します。

デフォルト チャネルを使用して、信頼できるサーバー (または別の関数) からイベントを公開するには:

import {getEventarc} from 'firebase-admin/eventarc';

getEventarc().channel().publish({
    type: 'achieved-leaderboard',
    subject: 'Welcome to the top 10',
    data: {
      message: 'You have achieved the nth position in our leaderboard!  To see . . .'
    }
});

Firebase は、デフォルト チャネルを自動的に作成するだけでなく、イベントのソースを指定する環境変数EVENTARC_CLOUD_EVENT_SOURCEを設定します。 Cloud Functions for Firebase の外部でイベントを発行する場合は、イベント ペイロードにsourceフィールドを明示的に追加する必要があります。

onCustomEventPublishedでイベントを処理する

onCustomEventPublishedハンドラーを使用して、拡張イベントを含むすべてのカスタム イベントを処理できます。まず、Eventarc SDK からこのハンドラを、カスタム ロジック用の Node.js 用 Firebase Admin SDK とエラー処理用のlogger SDK とともにインポートします。

const {onCustomEventPublished} = require("firebase-functions/v2/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

関数コードで、サンプル関数onimageresizedに示されているように、イベント名を渡します。

exports.onimageresized = onCustomEventPublished(
    "firebase.extensions.storage-resize-images.v1.complete",
    (event) => {
      logger.info("Received image resize completed event", event);
      // For example, write resized image details into Firestore.
      return getFirestore()
          .collection("images")
          .doc(event.subject.replace("/", "_")) // original file path
          .set(event.data); // resized images paths and sizes
    });

特定の拡張機能ごとに、イベント オブジェクトで返されるペイロードは、アプリケーション フローのカスタム ロジックを実行するために使用できるデータを提供します。この場合、関数は Admin SDK を使用してサイズ変更された画像に関するメタデータを Cloud Firestore のコレクションにコピーし、イベントによって提供されたsubjectからファイル名を取得し、イベントによって提供されたdataからメタデータを保存します。

デフォルト以外のチャネルでイベントを発行および処理する

カスタム チャネルは、特別な権限やその他の要件があり、すべてのイベントに対して同じレベルの可視性とアクセスを必要としない場合に役立ちます。 Google Cloud コンソールを使用して独自のチャネルを作成できます。イベントの公開とサブスクライブは、同じチャネルで行う必要があります。

カスタム イベントが既定以外のチャネルで発行される場合は、関数コードでチャネルを指定する必要があります。たとえば、 us-west1ロケーションのデフォルト以外のチャネルで発行されたイベントを処理する場合は、次のようにチャネルを指定する必要があります。

import { onCustomEventPublished } from "firebase-functions/v2/eventarc";

export const func = onCustomEventPublished(
    {
      eventType: "firebase.extensions.storage-resize-images.v1.complete",
      channel: "locations/us-west1/channels/firebase",
      region: "us-west1",
    },
    (event) => { ... });