ひとつのFirebaseプロジェクトに複数アプリを同居させて運用する実用性の検討 2023年11月時点
検討必要なFirebaseサービス
- Authentication
- Firestore
- App Check
- Functions
- Extensions
- Remote Config
- Crashlytics
- Analytics
- Messaging
Firebaseプロジェクト自体は既に複数のアプリは登録できる
iOSとAndroidのアプリを登録したりすることは一般的
Authentication
Identity Platformを使用するようにアップグレードすると、マルチテナンシーが利用できる
Firebase Authentication
1アプリにつき1テナントを割り当てることで1つのFirebaseプロジェクトでも認証は別々にできる
マルチテナンシーを使用した認証 | Identity Platform のドキュメント | Google Cloud
Firestore
Firestoreは2023年7月には複数のデータベースを持てるようになった
2023年11月時点では公開プレビュー版
なお無料の割り当ては (default)
のみに適用されるので最低でも毎月数十円のコストはかかる?
ローカルエミュレータ
複数データベースには未対応
セキュリティルールとインデックス
のように記述するがドキュメントが間違っていて、 default
ではなくて (default)
が正しい。
また、firebase deploy --only
の際にCloud Functionsのノリで firebase deploy --only firestore:rules
とするとデプロイされない。
正しくは firebase deploy --only firestore
である( rules
という名前のデータベースが存在するならデプロイされる。要は ":" の後ろはデータベースの名前を示す)
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"
}
]
Identity Platformのテナントごとにデータベースを分ける場合、データベースの名称はテナントIDと同じにしておくとアクセスする際に分かりやすい
データベースの名称はテナントIDと同じにしておくとアクセスする際に分かりやすい
分かりやすくない。というか実用的ではない。
というのも、テナントIDは指定した名称の末尾にランダムな文字が追加される。e.g. foo-l7m49
なので開発環境と本番環境でそれぞれFirebaseプロジェクトを作っている場合、同じテナントIDにすることはできない。
firebase.jsonでセキュリティルールを定義する際に database
で名称を指定するが、開発と本番で名前を切り替えることはできない
App Check
複数個のアプリを登録できるので問題なし
Functions
全アプリで共用することになるので、命名規則は必要か。
複数のアプリで共用する関数があったとしても、 user.tenantId
や event.database
で見分けられる
functions()
.auth.user()
.onCreate((user, context) => {
const tenantId = user.tenantId;
});
firestore.onDocumentCreated("users/{userId}", (event) => {
const database = event.database; // "(default)"
});
Extensions
Extensionsの実装によりけり
Stream Firestore to BigQueryではFirestoreはデフォルトのデータベースしか対象ではない
issueは立っているが、そもそも複数のデータベースはまだプレビュー版なのですぐには対応はないだろう...
🐛 [firestore-bigquery-export] Select firestore database · Issue #1743 · firebase/extensions
もし現時点で利用したい場合は (default)
のデータベースにCloud FunctionsでonDocumentWrittenトリガーでコピーすればいい?
そういうExtensionsを実装してもいいかもしれない
Remote Config
複数アプリで共用する形になるが問題はない
Crashlytics
複数アプリに対応しているので問題ない
Analytics
複数アプリに対応しているので問題ない
Messaging
複数アプリに対応しているし、トピックを設定していれば全部のアプリに一気に通知を送ることもできそう
で実践中