Firebaseを使っていてAプロジェクトとBプロジェクトという2つのプロジェクトを別に開発している際、AプロジェクトのCloud Functions for FirebaseからAプロジェクトのFirestoreも参照しつつ、BプロジェクトのFirestoreも参照したい時があるかと思います。

今回はその方法についてご紹介したいと思います。
GCPで別プロジェクトからのFirestore参照権限を付与する
次の手順でBプロジェクトに対するAからの参照権限を付与します。
1.GCPの管理画面(https://console.cloud.google.com/)にアクセスします。
2.画面左上にあるボックスでBプロジェクトをセットします。

3.左のメニューからIAMと管理→IAMを選択します。

4.IAMと管理画面で追加を選択します。

5.新しいプリンシパルに”AプロジェクトのプロジェクトID@appspot.gserviceaccount.com”を入力し、ロールにFirebase閲覧者を設定して保存します。(ロールの設定はフィルタで”Firebase 閲覧”と入力すると見つけやすいです)
注:プロジェクトID@appspot.gserviceaccount.comのプリンシパルはAプロジェクトのCloud Functions for Firebaseでソースがデプロイされていないと存在しません。

これでAプロジェクトからBプロジェクトのFirestoreを参照する準備ができました。
Cloud Functions for FirebaseでFirestoreの向き先を変更せずに別プロジェクトのFirestoreを参照する方法
Cloud Functions for FirebaseでAプロジェクトとBプロジェクト両方のFirestoreの参照を行う方法について紹介します。
以下の内容はfirebase-adminを使ってCloud Functions for Firebaseの開発を行う想定となっております。
firebase-adminのinitializeAppメソッドでFirestoreの向き先を変えてしまうとAプロジェクトのFirestoreが参照できなくなってしまうので、BプロジェクトのFirestoreのインスタンスを都度生成して参照するサンプルを下記に記載します。
import * as admin from 'firebase-admin';
import { Firestore } from "firebase-admin/firestore";
public static async getFirebaseCollectionTest(): Promise<any> {
try {
// Initialize Firebase
const fireStore = new Firestore({
projectId: "BプロジェクトのプロジェクトID",
credential: admin.credential.applicationDefault()
});
return fireStore.collection("Test");
} catch (error) {
return { error: error.message, code: 500 }
}
}
上記サンプルではFirestoreのコンストラクタにBプロジェクトのプロジェクトIDとAプロジェクトのクレデンシャルを指定することでFirestoreのインスタンスを生成しています。
このインスタンスからBプロジェクトのFirestoreのコレクションの取得を行って返却を行なっています。
如何でしたでしょうか?
年々Firebaseは機能が追加され、便利になっていきているのでどんどん活用していきたいと思っています!