Cloud FirestoreをExportしてImportする
Cloud FirestoreをExportして、別プロジェクトのCloud FirestoreにImportすることがあったのでその方法を残しておきます。
Cloud FirestoreをExportする
今回はClound Functionsのscheduleを使って定期的にバックアップとしてCloud StorageにExportするようにしました。 この2つの記事がものすごく参考になりました。
1. サービスアカウントに権限をつける
Exportした結果をCloud Storageにアップロードするので、サービスアカウントに下記の権限を付与します。
- 環境とストレージ オブジェクトの管理者 - Cloud Datastore インポート / エクスポート管理者
さっそくGCPのIAMページを開いて PROJECT_ID@appspot.gserviceaccount.com
のサービスアカウントの鉛筆マークを選択します。
そして、 + 別の役割を追加
を選んで2つの役割を追加して保存します。
2. Cloud Functionsで定期的にCloud FirestoreをExportする
Cloud Functionsのscheduleを使って、特定の時間にCloud StorageにCloud FirestoreからExportします。この場合は毎朝5時に実行されます。
const functions = require('firebase-functions'); const firestore = require('@google-cloud/firestore'); export const backupFirestore = functions.pubsub.schedule('every day 05:00').timeZone('Asia/Tokyo').onRun(async (context) => { const projectId = 'PROJECT_ID'; const client = new firestore.v1.FirestoreAdminClient(); const databaseName = client.databasePath(projectId, projectId); await client.exportDocuments({ name: databaseName, outputUriPrefix: `gs://${projectId}-backups-firestore`, collectionIds: [] }); return null; });
コードを書いたらCloud FunctionsにDeployします。
3. 動作確認
それでは、GCPのCloud Scheduler画面の「今すぐ実行」から実行してみましょう。
実行のログは、少し待ってからCloud Functionsのログタブで確認することができます。
Exportが成功するとCloud Storageに下記のようなディレクトリができます。これでExportできました。
Cloud FirestoreにImportする
次にExportしたコレクションをCloud FirestoreにImportします。
1. ImportしたいプロジェクトのCloud Storageにアップロードする
※ExportとImportするプロジェクトが同じであればこの手順は不要です。
Cloud FirestoreにImportする場合は、下記の手順で一度ダウンロードしてから、ImportしたいCloud Firestoreと同じプロジェクトのCloud Storageにアップロードします。
// ローカルにダウンロード gsutil -m cp -R gs://BUCKET_NAME/2019-12-08T00:00:00_00000 . // Cloud Storageにアップロード gsutil cp -R 2019-12-08T00:00:00_00000 gs://NEW_BUCKET_NAME/
2. gcloudコマンドでImportする
先ほどアップロードしたファイル名を指定して、下記のコマンドでFirestoreにimportします。既に存在しているIDと同じデータをImportするとエラーになるようなので、すべて消してからImportするのがよさそうです。
gcloud firestore import gs://NEW_BUCKET_NAME/2019-12-08T00:00:00_00000
特定のコレクションのみのImport方法などはこちらに書いてありました。
これでCloud FirestoreへのImportもできました。
まとめ
やる前は色々大変そうだなと思っていたのですが、Cloud Functionsにscheduleがあったり、GCPの中で完結したので特に詰まることなくできてよかったです!