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

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

始める前に

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

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

Cloud 関数と 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 projectId = process.env.GCP_PROJECT;
      const databaseName = 
        client.databasePath(projectId, '(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']}`);
      })
      .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 関数を作成
  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.GCP_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 関数をデプロイします。
Cloud Scheduler ジョブを作成する

次に、Cloud 関数を呼び出す 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 関数と Cloud Scheduler ジョブがデプロイされましたが、Cloud 関数にはエクスポート オペレーションを実行するためのアクセス権限がまだ付与されていません。

アクセス権限を構成する

次は、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
    

App Engine のデフォルトのサービス アカウントを無効にするか削除すると、App Engine アプリから Cloud Firestore データベースへのアクセス権限が失われます。App Engine のサービス アカウントを無効化しても、再び有効化できます。サービス アカウントの有効化をご覧ください。App Engine のサービス アカウントを削除しても、その削除が過去 30 日以内であればサービス アカウントを復元できます。サービス アカウントの削除の取り消しをご覧ください。

Cloud Scheduler ジョブと Cloud Functions の関数をテストする

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] のページに移動します。

関数のログに移動

Google Cloud コンソール

GCP Console の [Cloud Functions] ページに移動します。

[ログビューア] に移動

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

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

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

Cloud Storage ブラウザを開く