GCP 版 Cloud Functions からも Firestore をトリガーしたい

thumbnail

トリガーとは

ご存知の通り、Firebase の Cloud Functions は Firestore の トリガー が使えます。

これはドキュメントの追加、削除を検知して任意の処理を実行させることができます。

const functions = require("firebase-functions");

exports.myFunction = functions.firestore
  .document("my-collection/{docId}")
  .onWrite((change, context) => {
    /* ... */
  });

よくある処理はあるドキュメントが書き込まれたとき、同じ内容を別 collection に書き込むなどです。

とても便利な機能ですが functions.firestore とある通り、Firebase 限定の機能に見え(functions は firebase-functions モジュールなので)、事実 GCP 版 Cloud Functions ではこのモジュールを使わずに Function を定義するので使えません。

trigger を登録する

トリガーそのものについてのドキュメントはこちらにあります。

FYI: https://cloud.google.com/functions/docs/calling/cloud-firestore

GUI からの登録

GCP 版では Functions の設定は GUI で行えます。 トリガーを登録できるセクションがあるのでここで登録できます。

トリガーのGUI

CD 時に登録

Firebase のときは GUI でいちいち設定しなくて良かったので、同じことを GCP でもやりたいです。 GCP 版では CI/CD のタイミングで API 経由でその設定を行い、GUI 設定をしなくていいようにしましょう。

結論を先に書くと、GitHub Actions であればこのような yaml を用意します。

- id: "deploy"
  uses: "google-github-actions/deploy-cloud-functions@v0"
  with:
    name: "onSaveComment"
    runtime: "nodejs14"
    region: asia-northeast1
    description: firestore trigger
    entry_point: onSaveComment
    event_trigger_type: providers/cloud.firestore/eventTypes/document.write
    event_trigger_resource: "projects/xxxxxx/databases/(default)/documents/users/{user}/comments/{comment}"

GitHub Actions で CloudFunctions を使う方法についてはこちらをご覧ください。

FYI: https://blog.ojisan.io/gha-functions/

注目すべきは event_trigger_type と event_trigger_resource です。 event_trigger_type は紐づけるイベントを指定します。 ここではドキュメントの書き込み・編集をトリガーしています。

event_trigger_resource では監視対象を設定します。 注意すべきは (default) です。 これはこういうものです。 firestore rules でも同じような文言がでてきたはずです。

これらに何を書いたらいいかは Google Cloud Firestore トリガー に書かれているのでこちらを参照してください。