Cloud FirestoreをExportしてImportする

Cloud FirestoreをExportして、別プロジェクトのCloud FirestoreにImportすることがあったのでその方法を残しておきます。

Cloud FirestoreをExportする

今回はClound Functionsのscheduleを使って定期的にバックアップとしてCloud StorageにExportするようにしました。 この2つの記事がものすごく参考になりました。

medium.com

firebase.google.com

1. サービスアカウントに権限をつける

Exportした結果をCloud Storageにアップロードするので、サービスアカウントに下記の権限を付与します。

- 環境とストレージ オブジェクトの管理者
- Cloud Datastore インポート / エクスポート管理者

さっそくGCPのIAMページを開いて PROJECT_ID@appspot.gserviceaccount.com のサービスアカウントの鉛筆マークを選択します。

f:id:t-kashima:20191210221649p:plain

そして、 + 別の役割を追加 を選んで2つの役割を追加して保存します。

f:id:t-kashima:20191210221822p:plain:w160

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. 動作確認

それでは、GCPCloud Scheduler画面の「今すぐ実行」から実行してみましょう。

f:id:t-kashima:20191210222900p:plain:w240

実行のログは、少し待ってからCloud Functionsのログタブで確認することができます。

f:id:t-kashima:20191210223043p:plain:w320

Exportが成功するとCloud Storageに下記のようなディレクトリができます。これでExportできました。

f:id:t-kashima:20191210223201p:plain

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方法などはこちらに書いてありました。

firebase.google.com

これでCloud FirestoreへのImportもできました。

まとめ

やる前は色々大変そうだなと思っていたのですが、Cloud Functionsにscheduleがあったり、GCPの中で完結したので特に詰まることなくできてよかったです!