Firebase Summit のすべての発表内容に目を通し、Firebase を活用してアプリ開発を加速し、自信を持ってアプリを実行できる方法をご確認ください。 詳細

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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

あなたが始める前に

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

  1. Google Cloud プロジェクトの課金を有効にします。エクスポートおよびインポート機能を使用できるのは、課金が有効になっている Google Cloud プロジェクトのみです。
  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 projectId = process.env.GCP_PROJECT || process.env.GCLOUD_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 コンソール
クラウド関数を作成する
  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. [実行する関数] の下に、 index.js内の関数の名前、 scheduledFirestoreExportを入力します。
  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]を選択します。 Topicフィールドに、Cloud Function とともに定義した pub/sub トピックの名前を入力します。上記の例では、 initiateFirestoreExportです。
  7. ペイロードフィールドにstart exportと入力します。ジョブにはペイロードを定義する必要がありますが、上記の Cloud Function は実際にはこの値を使用しません。
  8. [作成]をクリックします。
この時点で、Cloud Function と Cloud Scheduler ジョブをデプロイしましたが、Cloud Function には、エクスポート操作を実行するためのアクセス許可がまだ必要です。

アクセス権限の構成

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

この 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からアクセスできます。
クラウド シェルを開始する

  1. Cloud Datastore Import Export Adminロールを割り当てます。 PROJECT_IDを置き換えて、次のコマンドを実行します:

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

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

App Engine のデフォルト サービス アカウントを無効にするか削除すると、App Engine アプリは Cloud Firestore データベースにアクセスできなくなります。 App Engine サービス アカウントを無効にした場合は、再度有効にすることができます。サービス アカウントの有効化 を参照してください。過去 30 日以内に App Engine サービス アカウントを削除した場合は、サービス アカウントを復元できます。サービス アカウントの削除の取り消しを参照してください。

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

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

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

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

    数秒後、Cloud Scheduler ジョブは結果列を [成功] に更新し、[最終実行] を現在の時刻に更新します。 [更新] をクリックする必要がある場合があります。

Cloud Scheduler ページは、ジョブが Cloud Function を呼び出したことのみを確認します。 Cloud Function ページを開いて、関数のログを表示します。

Cloud Function ログを表示する

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

Firebase コンソール

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

関数ログページを開く

GCP コンソール

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

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

エクスポートの進行状況を表示する

gcloud firestore operations listコマンドを使用して、エクスポート オペレーションの進行状況を表示できます。エクスポートおよびインポート オペレーションの管理を参照してください。

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

Cloud Storage ブラウザを開く