Firebaseのバックアップは?
Firebaseのバックアップは?
2020年10月28日
Firebaseのバックアップは?
Firebaseを利用したプロジェクトはどうやってバックアップをするか気になりますよね? この記事は、Firebaseを利用したプロジェクトをどのようにバックアップをするかをまとめてみました。
Firebaseを利用したプロジェクトのバックアップと言っても利用している機能によって扱いが変わってきます。この記事では以下の機能に関するバックアップについてまとめています。
- プロジェクトの登録ユーザー(Firebaseのアカウント)
- Firebaseのホスティングデータ
- Firebaseのデータベースのデータ(Cloud Firestore)
- Firebaseのストレージのデータ
- Firebaseのファンクション(Functions/バックエンドサービスのコード)
プロジェクトの登録ユーザー(Firebaseのアカウント)
FirebaseのプロジェクトのユーザはFirebaseが管理しています。Firebaseコンソールに行くとそのリストを見ることができます。
一つの方法は、そのリストから手作業でユーザーのリストを抜き出すことができます。 残念ながら、Firebaseのクライアント側のSDKからはこのリストにはアクセスできません。 プログラムで管理するには、Firebase Admin SDKを使って、管理用のツールをNode.jsのアプリとして作成する必要があります。
制限事項としては、パスワード情報にはアクセスできません。ユーザのリストやUID などを取得などに限定された情報のみになります。
Firebaseのホスティングデータ
Firebaseのホスティングデータのデプロイメント(サイトの公開)は、公開するデータをFirebaseのプロジェクトフォルダーに入れて行う方式で行われます。
例えば、シンプルなHTMLファイルなどで構成されるサイトの場合は、公開するファイルを「public」フォルダーの下において、「firebase deploy」を実行するようになっています。いったん公開されたファイルをダウンロードすることは基本的にできないので、この公開に使用したデータをバックアップします。
これはPC状の普通のファイルなので通常のPCのデータのバックアップと同じ方法でバックアップが可能です。
ReactやVueなどのフロントエンドのフレームワークを使った場合は、公開するデータはReactやVueのソースコードから生成したデータになります。そのため、ReactやVueのソースコードをバックアップしておけば良いことになります。Git/GitHubなどを利用するのも一つの方法ですし、他のPC PCのデータと同じような方法でバックアップを取ることができます。
Firebaseのデータベースのデータ
Firebaseのデータベース(Cloud Firestore)のデータは少し面倒です。 Firebaseコンソールでデータベースに格納されているデータを見ることはできますが、これをファイルなどの形に保存することはできません。
データベースのデータ量は大きくなる場合が多く、手作業でのバックアップは現実的ではありません。方法としては、管理用のアプリを開発して、アプリを使ってファイルに保存する方法が一番現実的です。
フロントエンドのプログラムでバックアップ
通常のクライアント側のSDKを使って、フロントエンドのコードでバックアップをする場合は実装方法がやや複雑になります。
- 管理用のアプリは「管理ユーザー」で実行する必要がある
- ファイルの中身を作ってファイルをダウンロードする仕組みが必要
これは、Webブラウザで動作するフロントエンドのJavascriptのコードはセキュリティ上の理由で制約が多くなるためです。すべてのデータをバックアップするには最低でも全てのデータの読み込み権限が必要です。バックアップだけのために複雑なセキュリティルールを設定するのは余り現実的な方法ではありません。 通常は、管理用のアカウントを作って、そのユーザーにすべてのコレクションとドキュメントの読み込み権限を与えてアクセスするのが一番簡単な方法です。
ただし、このユーザーの扱いには注意が必要です。このユーザーはすべてのデータベースの読み込みが可能になるので、WebアプリやWebサービスのセキュリティホールになりやすいためです。 一つの回避策は、この管理アプリはインターネットに公開せずに開発用のPCなどから、検証用のサーバを介して利用することで、一般の人には簡単にアクセスできないような形をとる方法があります。
Firebase Admin SDKを使ってNode.jsのアプリを作る
この方法が一番シンプルです。Admin SDKからはFirebaseのすべてのデータにアクセス可能なので、Admin SDKでNode.jsのスクリプトを開発して、データを読み出してPCに保存するというのが制約も少なく、リスクも少ない方法です。
この管理アプリはインターネットに公開する必要がないので、第三者に利用されるリスクも殆どゼロです。また、ダウンロードではなく、実行しているPCに直接ファイルを書きこむことも可能なのでバックアップしたファイルの取り扱いも簡単です。
バックアップするデータ形式は?
一番簡単にできるのが「CSV」と呼ばれるテキストファイルで保存する方法です。 特に「テーブル」に近い形でのデータをコレクションに保存している場合にはとても有効です。
ファイルを見る際も通常の表計算ソフト(Microsoft Excelなど)で簡単にみられるので便利です。ただし、複数の票を同じファイルに持つことができないので複数のコレクションをバックアップするにはあまり向いていません。
代替え案としては、Microsoft Excelのファイル形式(.xlsx)などで保存すると、複数のテーブルを一つのファイルに保存することができるので扱いが楽です。インターネットなどでMicrosoft Excelのファイルを読み書きできるnpmのモジュールが公開されています。そうしたモジュールを利用すれば余り手間をかけずにMicrosoft Excelのファイルを作ることができます。
Firebaseのストレージのデータ
これは一つ一つになりますが、Firebaseコンソールからダウンロードすることができます。 ファイルの数が多い場合は一つ一つファイルをダウンロードするのは現実的ではありません。 その場合は、やはり管理用のプログラムでダウンロードするのが手っ取り早い方法です。
フロントエンド側のコードでもダウンロードは可能ですが、URLの取得にはすべての読み込み権限が必要になります。したがって、管理用のユーザーを作成して読み込み権限を与えるセキュリティルールが必要になります。
別の方法としては、「gsutil」を使う方法です。FirebaseのAdmin SDKではストレージ機能はサポートされていないので、バックエンドでストレージにアクセスする場合は、基本的にCloud StoreateのAPIを使います。ただひ、CloudCloud Storageにはgsutilというツールが用意されていてこれを利用するとコマンドラインからコピーできます。
$ gsutil cp -r gs://[bucket Name]/xxxxx [コピー先のパス]
のようにファイルをコピーする感覚で利用できます。バッチファイルを書けばまとめてダウンロードできます。
Firebaseのファンクション(Functions/バックエンドサービス)
これはホスティングのバックアップとほぼ同じです。 「public」フォルダの代わりに、Firebaseプロジェクトフォルダの「functions」の下のファイルをバックアップします。
まとめ
Firebaseのデータをバックアップする場合、機能ごとに対応する必要があります。 ホスティングやファンクションのデータは、デプロイするPC上にあるので問題は少ないと思います。一方で、Firebaseのデータベースやストレージの場合は、手作業でバックアップを行う方法はありますが、余り現実的な方法ではありません。管理用のアプリを開発して、プログラムで処理する仕組みを作るのが一番です!
管理用のアプリはWebブラウザー側で処理するフロントエンドのアプリでも対応可能ですが、セキュリティなどを考えると、Firebase Admin SDKやGoogle Cloude Storageのツールを使ったほうが拡張もしやすくセキュリティ上の問題も少ないのでおすすめです。
Firebaseに登録されているユーザーアカウントのリストはバックアップ可能ですがパスワードなどのログイン情報は基本的にアクセスできません。必要な場合は、別にデータベースを作成して記録しておくことも可能ですが、セキュリティ上はあまりお勧めできる方法ではありません。
個々のバックアップ法の詳細については、将来詳しい実装例を記事にしようと考えています。
この記事はバックアップ全般のコンセプトについて解説させていただきました!
コメント
コメントを投稿