Closed19

ひとつのFirebaseプロジェクトに複数アプリを同居させて運用する実用性の検討 2023年11月時点

kingukingu

検討必要なFirebaseサービス

  • Authentication
  • Firestore
  • App Check
  • Functions
  • Extensions
  • Remote Config
  • Crashlytics
  • Analytics
  • Messaging
kingukingu

Firebaseプロジェクト自体は既に複数のアプリは登録できる
iOSとAndroidのアプリを登録したりすることは一般的

kingukingu

Authentication

Identity Platformを使用するようにアップグレードすると、マルチテナンシーが利用できる
Firebase Authentication

1アプリにつき1テナントを割り当てることで1つのFirebaseプロジェクトでも認証は別々にできる
マルチテナンシーを使用した認証  |  Identity Platform のドキュメント  |  Google Cloud

kingukingu

テナント毎に認証は分かれているので、アプリ内から アカウントを削除 といった処理をする場合、AuthenticationのUserを削除しても、同じFirebaseプロジェクトに同居しているUserには影響はない。

kingukingu

もし同居アプリ間で同一ユーザのデータを読み書きしたい場合はtenantIdを切り替えれば認証は可能か?
Firestoreへのアクセスも都度切り替えればできそうではある

kingukingu

Firestore

Firestoreは2023年7月には複数のデータベースを持てるようになった
https://cloud.google.com/blog/ja/products/databases/manage-multiple-firestore-databases-in-a-project

2023年11月時点では公開プレビュー版
https://firebase.google.com/docs/firestore/manage-databases?hl=ja#firebase-cli

なお無料の割り当ては (default) のみに適用されるので最低でも毎月数十円のコストはかかる?
https://firebase.google.com/docs/firestore/manage-databases?hl=ja#:~:text=無料の割り当ては、(default) データベースでのみ使用できます。

kingukingu

セキュリティルールとインデックス

https://firebase.google.com/docs/cli?hl=ja#firestore-multiple-dbs

のように記述するがドキュメントが間違っていて、 default ではなくて (default) が正しい。
また、firebase deploy --only の際にCloud Functionsのノリで firebase deploy --only firestore:rules とするとデプロイされない。
正しくは firebase deploy --only firestore である( rules という名前のデータベースが存在するならデプロイされる。要は ":" の後ろはデータベースの名前を示す)

https://stackoverflow.com/a/77495474/12856415

e.g.

  "firestore": [
    {
      "database": "(default)",
      "rules": "firestore.default.rules",
      "indexes": "firestore.default.indexes.json"
    },
    {
      "database": "foo",
      "rules": "firestore.foo.rules",
      "indexes": "firestore.foo.indexes.json"
    }
  ]
kingukingu

Identity Platformのテナントごとにデータベースを分ける場合、データベースの名称はテナントIDと同じにしておくとアクセスする際に分かりやすい

kingukingu

データベースの名称はテナントIDと同じにしておくとアクセスする際に分かりやすい

分かりやすくない。というか実用的ではない。
というのも、テナントIDは指定した名称の末尾にランダムな文字が追加される。e.g. foo-l7m49
なので開発環境と本番環境でそれぞれFirebaseプロジェクトを作っている場合、同じテナントIDにすることはできない。

firebase.jsonでセキュリティルールを定義する際に database で名称を指定するが、開発と本番で名前を切り替えることはできない

kingukingu

App Check

複数個のアプリを登録できるので問題なし

kingukingu

Functions

全アプリで共用することになるので、命名規則は必要か。

複数のアプリで共用する関数があったとしても、 user.tenantIdevent.database で見分けられる

functions()
  .auth.user()
  .onCreate((user, context) => {
    const tenantId = user.tenantId;
  });

firestore.onDocumentCreated("users/{userId}", (event) => {
  const database = event.database; // "(default)"
});
kingukingu

Extensions

Extensionsの実装によりけり

Stream Firestore to BigQueryではFirestoreはデフォルトのデータベースしか対象ではない
https://github.com/firebase/extensions/blob/next/firestore-bigquery-export/functions/src/index.ts#L100-L103

issueは立っているが、そもそも複数のデータベースはまだプレビュー版なのですぐには対応はないだろう...
🐛 [firestore-bigquery-export] Select firestore database · Issue #1743 · firebase/extensions

kingukingu

もし現時点で利用したい場合は (default) のデータベースにCloud FunctionsでonDocumentWrittenトリガーでコピーすればいい?
そういうExtensionsを実装してもいいかもしれない

kingukingu

Crashlytics

複数アプリに対応しているので問題ない

kingukingu

Analytics

複数アプリに対応しているので問題ない

kingukingu

Messaging

複数アプリに対応しているし、トピックを設定していれば全部のアプリに一気に通知を送ることもできそう

このスクラップは2ヶ月前にクローズされました