Firebase admin SDKで作る管理ツール

記事
IT・テクノロジー

Firebase admin SDKで作る管理ツール

FirebaseでWebサービスやWebアプリを実装する場合、管理用のツール(アプリ)があると便利な場合がたくさんあります。開発者の場合は、Firebaseコンソールから必要な管理は殆ど可能です。しかし、一般の利用者の方々には、Firebaseコンソールはちょっと不便です。また、扱うデータの数が増えてくると、Firebaseコンソールを使った管理は余り現実的ではありません。
そう考えると、専用の管理ツール(アプリ)の必要性は意外に大きくなります。
WebアプリやWebサービス自体に、管理機能を組み込むことも可能ですが、セキュリティルールの設定が複雑になります。また、WebアプリやWebサービスの場合、インターネット上に公開されているため、ユーザー認証(ログイン)による管理者の特定だけではセキュリティ上十分でない場合も多くなります。
この記事では、WebサービスやWebアプリの管理用のツール(アプリ)をFirebase admin SDKを利用して、管理用のPCで動作させる方法について解説します。

データベースのバックアップのツールを考える!

管理用のツール(アプリ)と言ってもいろいろな機能が考えられます。この記事では特に、Firebase Cloud Firestoreのデータベースのデータをバックアップする管理ツール(アプリ)について考えて行きます。
Firebase admin SDKは、幾つかのプログラミング言語をサポートしています。
* Node.js
* Java
* Pyshon
* Go
* C#
この記事では、WebアプリやWebサービスと同じ言語で記述可能な「Node.js」を利用する例を紹介します。 まずは、管理ツール(アプリ)の為のプロジェクトフォルダを作成して、「Firebase admin SDK」のパッケージをインストールします。
$ npm init -y
$ npm install firebase-admin --save
でFirebase admin SDKのパッケージがインストールされます。Firebase admin SDKを使うと、Node.jsのコードからFirebaseのリソースにアクセスが可能になります。
ソースコードの品質と将来の管理を考えるとTypescriptを使った方が有利なので、Typescriptの設定も行います。
npm install typescript
そのあとで、Typescriptのスクリプトをpackage.jsonに追加します。
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "tsc": "tsc"
  },
実行するとtsconfig.jsonが作成されるので、コンパイル後のファイルが保存されるフォルダを指定します。 以下の例では「dist」の下にファイルが作成されるように設定しています。 作成されたファイルに「outDir」という設定項目があるのでその部分のコメントを外して変更します。
"outDir": "./dist", /* Redirect output structure to the directory. */
と設定するとコンパイルされた後にJavascriptのファイルが「dist」フォルダの下に作成されます。

Firebase Cloud Firestoreのコレクションにアクセス

まずは、Firebase Cloud Firestoreのコレクションにアクセスしてみます。
Firebase admin SDKの初期化をすれば、通所のフロントエンドのJavascript(Typescript)でアクセスする場合とほぼ同じようなコードでアクセスできます。
「address」というコレクションにアクセスする例です。
import * as admin from "firebase-admin";
const serviceAccount = require("../serviceAccountKey.json");
const firebaseAdmin = admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://sample-xxxxx.firebaseio.com",
});
firebaseAdmin
  .firestore()
  .collection("address")
  .get()
  .then((querySnapshot: admin.firestore.QuerySnapshot) => {
    querySnapshot.forEach(
      (
        doc: admin.firestore.QueryDocumentSnapshot<admin.firestore.DocumentData>
      ) => {
        console.log(doc.data());
      }
    );
  });
まずは、Typescriptをコンパイルして、実行可能なJavascriptファイルを生成します。 コマンドラインから以下のコマンドを実行します。
$ npm run tsc
あとは、生成されたJavascriptのファイルを実行するとデータベースにアクセスできます。
$ node dist/index.js
{
  email: 'taro.yamada@xxxx.xxx',
  name: 'Taro Yamada'
}
{
  email: 'hanako.yamada@xxxx.xxx',
  name: 'Hanako Yamada',
}
のようにFirebase Cloud Firestoreにアクセスできる事がわかります。

内容をファイルに書き出す

実用的なバックアップとは言えませんが、Firebase Cloud Firestoreから取り込んだ「JSON形式」のデータをテキストファイルとして保存するには上のコードを少し変更すると簡単にできます。
import * as admin from "firebase-admin";
const fs: any = require("fs");
const serviceAccount = require("../serviceAccountKey.json");
const firebaseAdmin = admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://sample-xxxxx.firebaseio.com",
});
firebaseAdmin
  .firestore()
  .collection("address")
  .get()
  .then((querySnapshot: admin.firestore.QuerySnapshot) => {
    querySnapshot.forEach(
      (
        doc: admin.firestore.QueryDocumentSnapshot<admin.firestore.DocumentData>
      ) => {
        const entry: any = doc.data();
        contents = contents + JSON.stringify(entry) + "\n";
      }
    );
    fs.writeFile("backup.txt", contents, (err: any) => {
      if (err) {
        console.log(err);
      }
    });
  });
またコンパイルして実行すると、「backup.txt」が作成されて、内容もデータベースから読み取ったJSON形式のテキストが保存されます。
{"email":"taro.yamada@xxxx,xxx","name":"Taro Yamada"}
{"email":"hanako.yamada@xxxx,xxx","name":"Hanako Yamada"}
簡単ですが、この仕組みを応用すればバックアップするためのアプリを作ることができます。
まとめ
Firebase admin SDKを使えば、簡単に管理用のPCからFirebaseのリソースにアクセスできるアプリを作ることができます。コマンドラインベースのアプリならば今回紹介したような形で機能を拡張していけば管理用のアプリが実現できます。
ただコマンドラインからの実行は、実用上はちょっと不便です。より使いやすい管理アプリにするには、Node.jsで管理用のPC上で簡易型のWebサーバーを動かしてWebブラウザ上で実行できるようにするとより使いやすい管理ツールになります。
今回は、コマンドラインのシンプルな例でしたが、今後より使いやすい、Webブラウザ上にユーザーインターフェースを実装した例を紹介していきます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら