データのエクスポートをスケジュールする

このページでは、Cloud Firestore データのエクスポートをスケジュールする方法について説明します。スケジュールに基づいてエクスポートを実行するには、Cloud Functions と Cloud Scheduler を使用することをおすすめします。

はじめに

マネージド データ エクスポートをスケジュールする前に、次のタスクを完了する必要があります。

  1. Google Cloud Platform プロジェクトに対する課金を有効にします。エクスポートとインポートの機能を使用できるのは、課金が有効になっている GCP プロジェクトのみです。
  2. エクスポート オペレーションには、エクスポート先の Cloud Storage バケットが必要です。Cloud Firestore データベースの場所に近いロケーションに、Cloud Storage バケットを作成します。エクスポート オペレーションには、リクエスト元による支払いバケットは使用できません。

Cloud Function と Cloud Scheduler ジョブを作成する

以下の手順に従って、Cloud Firestore データ エクスポートを開始する Node.js Cloud Function と、それを呼び出す Cloud Scheduler ジョブを作成します。

Firebase CLI
  1. Firebase CLI をインストールします。新しいディレクトリで、Cloud Functions の CLI を初期化します。

    firebase init functions --project PROJECT_ID
    1. 言語には JavaScript を選択します。
    2. 必要に応じて、ESLint を有効にします。
    3. y」と入力して依存関係をインストールします。
  2. functions/index.js ファイル内のコードを次のコードで置き換えます。

    const functions = require('firebase-functions');
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME';
    
    exports.scheduledFirestoreExport = functions.pubsub
                                                .schedule('every 24 hours')
                                                .onRun((context) => {
      const databaseName =
        client.databasePath(process.env.GCP_PROJECT, '(default)');
    
      return client.exportDocuments({
        name: databaseName,
        outputUriPrefix: bucket,
        // Leave collectionIds empty to export all collections
        // or set to a list of collection IDs to export,
        // collectionIds: ['users', 'posts']
        collectionIds: []
        })
      .then(responses => {
        const response = responses[0];
        console.log(`Operation Name: ${response['name']}`);
        return response;
      })
      .catch(err => {
        console.error(err);
        throw new Error('Export operation failed');
      });
    });
    
  3. 上記のコードで、次の変更を行います。
    • BUCKET_NAME を実際のバケット名で置き換えます。
    • every 24 hours を変更して目的のエクスポート スケジュールを設定します。AppEngine cron.yaml 構文または unix-cron 形式* * * * *)を使用してください。
    • 指定されたコレクション グループだけがエクスポートされるように collectionIds: [] を変更します。すべてのコレクションをエクスポートする場合は、そのままにします。

  4. スケジュール設定された関数をデプロイします。

    firebase deploy --only functions
GCP Console
Cloud Function を作成する
  1. GCP Console の [Cloud Functions] ページを開きます。

    [Cloud Functions] ページを開く

  2. [関数を作成] をクリックします。
  3. 関数名を入力します(例: firestoreExport)。
  4. [トリガー] で [Cloud Pub/Sub] を選択します。
  5. [トピック] で [新しいトピックを作成] を選択します。Pub/Sub トピックの名前を入力します(例: initiateFirestoreExport)。トピック名をメモしておいてください。Cloud Scheduler ジョブを作成するには、この情報が必要です。
  6. [ソースコード] で [インライン エディタ] をオンにします。index.js に、次のコードを入力します。
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME'
    
    exports.scheduledFirestoreExport = (event, context) => {
      const databaseName = client.databasePath(
        process.env.GCLOUD_PROJECT,
        '(default)'
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collections
          // or define a list of collection IDs:
          // collectionIds: ['users', 'posts']
          collectionIds: [],
        })
        .then(responses => {
          const response = responses[0];
          console.log(`Operation Name: ${response['name']}`);
          return response;
        })
        .catch(err => {
          console.error(err);
        });
    };
    上記のコードで、次の変更を行います。
    • BUCKET_NAME を実際のバケット名で置き換えます。
    • 指定されたコレクション グループだけがエクスポートされるように collectionIds: [] を変更します。すべてのコレクションをエクスポートする場合は、そのままにします。

  7. package.json に、次の依存関係を追加します。
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. [実行する関数] に「scheduledFirestoreExport」と入力します。これは、index.js 内での関数の名前です。
  9. [作成] をクリックして Cloud Function をデプロイします。
Cloud Scheduler ジョブを作成する

次に、Cloud Function を呼び出す Cloud Scheduler ジョブを作成します。

  1. GCP Console の [Cloud Scheduler] ページを開きます。

    [Cloud Scheduler] ページを開く

  2. [ジョブを作成] をクリックします。
  3. [名前] にジョブの名前を入力します(例: scheduledFirestoreExport)。
  4. [頻度] に入力します(例: every 24 hours)。
  5. [タイムゾーン] でタイムゾーンを選択します。
  6. [ターゲット] で [Pub/Sub] を選択します。[トピック] フィールドに、Cloud Function とともに定義した Pub/Sub トピックの名前を入力します。上記の例では、initiateFirestoreExport です。
  7. [ペイロード] フィールドに「start export」と入力します。ジョブにはペイロードを定義する必要がありますが、上記の Cloud Function で実際にこの値が使用されることはありません。
  8. [Create] をクリックします。
この時点で、Cloud Function と Cloud Scheduler ジョブがデプロイされましたが、Cloud Function にはエクスポート オペレーションを実行するためのアクセス権限がまだ付与されていません。

アクセス権限を構成する

次は、Cloud Function に、エクスポート オペレーションを開始する権限と GCS バケットに書き込む権限を付与します。

この Cloud Function は、プロジェクトのデフォルト サービス アカウントを使用して、エクスポート オペレーションを認証および承認します。プロジェクトを作成すると、次の名前のデフォルト サービス アカウントが作成されます。

PROJECT_ID@appspot.gserviceaccount.com

このサービス アカウントには、エクスポート オペレーションを開始する権限と、Cloud Storage バケットに書き込む権限が必要です。これらの権限を付与するには、次の IAM 役割をデフォルトのサービス アカウントに割り当てます。

  • Cloud Datastore Import Export Admin
  • バケットに対する Owner 役割または Storage Admin 役割

gcloud および gsutil コマンドライン ツールを使用して、これらの役割を割り当てることができます。

これらのツールがまだインストールされていない場合は、Google Cloud Platform Console の Cloud Shell からアクセスできます。
Cloud Shell の起動

  1. Cloud Datastore インポート / エクスポート管理者の役割を割り当てます。PROJECT_ID を実際のプロジェクト ID で置き換えて、次のコマンドを実行します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. バケットに対するストレージ管理者の役割を割り当てます。PROJECT_IDBUCKET_NAME を実際のプロジェクト ID、バケット名で置き換えて、次のコマンドを実行します。

    gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \
        gs://BUCKET_NAME
    

Cloud Scheduler ジョブと Cloud Function をテストする

Google Cloud Platform Console の Cloud Scheduler ページで、Cloud Scheduler ジョブをテストできます。

  1. GCP Console の [Cloud Scheduler] ページを開きます。
    [Cloud Scheduler] ページを開く

  2. 新しく作成した Cloud Scheduler ジョブの行で、[今すぐ実行] をクリックします。

    数秒後、Cloud Scheduler ジョブによって結果列が [成功] に更新され、[前回の実行] が現在の時刻に更新されるはずです。[更新] をクリックしなければならない場合があります。

[Cloud Scheduler] ページで確認できるのは、ジョブが Cloud Function を呼び出したことだけです。関数のログを確認するには、Cloud Function のページを開く必要があります。

Cloud Function のログを確認する

Cloud Function がエクスポート オペレーションを正常に開始したかどうかを確認するには、関数のログを開きます。

Firebase コンソール

Firebase コンソールで Cloud Functions のページを開きます。

[Functions] ページの [ログ] タブを開く

GCP Console

GCP Console で [Cloud Functions] ページを開きます。

[ログビューア] ページを開く

エクスポートの進行状況を確認する

gcloud firestore operations list コマンドを使用すると、エクスポート オペレーションの進行状況を確認できます。エクスポート / インポート オペレーションの管理をご覧ください。

エクスポート オペレーションの完了後は、Cloud Storage バケット内の出力ファイルを表示できます。

Cloud Storage ブラウザを開く