データのエクスポートをスケジュールする
このページでは、Firestore データのエクスポートをスケジュールする方法を説明します。スケジュールに基づいてエクスポートを実行するには、Cloud Run 関数と Cloud Scheduler を使用することをおすすめします。
始める前に
マネージド データ エクスポートをスケジュールする前に、次のタスクを完了する必要があります。
- プロジェクトの課金を有効にします。 Google Cloud エクスポート機能とインポート機能を使用できるのは、課金が有効になっている Google Cloud プロジェクトのみです。
- エクスポート オペレーションには、エクスポート先の Cloud Storage バケットが必要です。 お使いの Firestore データベースの場所に近いロケーションに、Cloud Storage バケットを作成します。エクスポート オペレーションには、リクエスト元による支払いバケットは使用できません。
Cloud Function と Cloud Scheduler ジョブを作成する
以下の手順に沿って、Firestore データ エクスポートを開始する Node.js Cloud Function と、その関数を呼び出す Cloud Scheduler ジョブを作成します。
Firebase CLI
-
Firebase CLI をインストールします。 新しいディレクトリで、Cloud Run 関数の CLI を初期化します。
firebase init functions --project PROJECT_ID
- 言語には JavaScript を選択します。
- 必要に応じて、ESLint を有効にします。
- 「
y」と入力して依存関係をインストールします。
-
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'); }); });
-
上記のコードで、次の点を変更します。
BUCKET_NAMEを実際のバケット名で置き換えます。YOUR_PROJECT_IDを実際のプロジェクト ID で置き換えます。- エクスポート スケジュールを設定するように
every 24 hoursを変更します。 AppEngine cron.yaml 構文 または unix-cron 形式(* * * * *)を使用してください。 -
指定されたコレクション グループだけがエクスポートされるように
collectionIds: []を変更します。すべてのコレクション グループをエクスポートする場合は、そのままにします。
-
スケジュール設定された関数をデプロイします。
firebase deploy --only functions
Google Cloud コンソール
Cloud Functions の関数を作成する
-
コンソールで [Cloud Functions] ページに移動します。 Google Cloud
- [関数を作成] をクリックします。
- 関数名を入力します(例:
firestore-export)。 - [トリガー] で [Cloud Pub/Sub] を選択します。
- [トピック] で [新しいトピックを作成] を選択します。Pub/Sub トピックの名前を入力します(例:
initiateFirestoreExport)。トピック名をメモしておいてください。Cloud Scheduler ジョブを作成するには、この情報が必要です。 - [ソースコード] で [インライン エディタ] をオンにします。
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) => { // Access the GCLOUD_PROJECT environment variable set by the runtime. const projectId = process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT; // Use the DATABASE_ID environment variable if set, // otherwise default to '(default)' const databaseId = process.env.DATABASE_ID || '(default)'; const databaseName = client.databasePath( projectId, databaseId ); return client .exportDocuments({ name: databaseName, outputUriPrefix: bucket, // Leave collectionIds empty to export all collection groups // or define a list of collection group 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: []を変更します。すべてのコレクション グループをエクスポートする場合は、そのままにします。 -
(省略可)デフォルト以外のデータベースを使用している場合は、Cloud Function の作成時に
DATABASE_ID環境変数を設定してください。If you are using a runtime whereGOOGLE_CLOUD_PROJECTが自動的に設定されない場合は、手動で設定するか、コード内のプロジェクト ID に置き換える必要があります。
package.jsonに、次の依存関係を追加します。{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } }- [実行する関数] に「
scheduledFirestoreExport」と入力します。これは、index.js内での関数の名前です。 - [作成] をクリックして Cloud 関数をデプロイします。
Cloud Scheduler ジョブを作成する
次に、Cloud 関数を呼び出す Cloud Scheduler ジョブを作成します。
-
コンソールで、[Cloud Scheduler] ページに移動します。 Google Cloud
- [ジョブを作成] をクリックします。
- [名前] にジョブの名前を入力します(例:
scheduledFirestoreExport)。 - [頻度] に入力します(例:
every 24 hours)。 - [タイムゾーン] でタイムゾーンを選択します。
- [ターゲット] で [Pub/Sub] を選択します。[トピック] フィールドに、Cloud Function とともに定義した Pub/Sub トピックの名前を入力します。上記の例では、
initiateFirestoreExportです。 - [ペイロード] フィールドに「
start export」と入力します。 ジョブにはペイロードを定義する必要がありますが、上記の Cloud Function で実際にこの値が使用されることはありません。 - [作成] をクリックします。
アクセス権限を構成する
次は、Cloud Function に、エクスポート オペレーションを開始する権限と GCS バケットに書き込む権限を付与します。
この Cloud Run 関数は、サービス アカウントを使用して、エクスポート オペレーションを認証および承認します。使用されるサービス アカウントは、Cloud Run functions の構成によって異なります。
- Cloud Functions(第 1 世代): App Engine のデフォルト
サービス アカウント:
PROJECT_ID@appspot.gserviceaccount.comを使用します。 - Cloud Run functions(第 2 世代): デフォルトの Compute Engine
サービス アカウントを使用します:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
このサービス アカウントには、エクスポート オペレーションを開始する権限と、Cloud Storage バケットに書き込む権限が必要です。これらの権限を付与するには、次の IAM ロールをサービス アカウントに割り当てます。
Cloud Datastore Import Export Admin- バケットに対する
Storage Adminロール Cloud Run Invoker(トリガー サービスが関数を呼び出せるようにするために、Cloud Run functions(第 2 世代)に必要)
gcloud および gsutil コマンドライン
ツールを使用して、これらの役割を割り当てることができます。
これらのツールがまだインストールされていない場合は、
コンソールの Google Cloud Cloud Shell
からアクセスできます。
Cloud Shell の起動
-
Cloud Datastore インポート / エクスポート管理者 のロールを割り当てます。 PROJECT_ID と SERVICE_ACCOUNT(
PROJECT_ID@appspot.gserviceaccount.comやPROJECT_NUMBER-compute@developer.gserviceaccount.comなど)を置き換えて、次の コマンドを実行します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/datastore.importExportAdmin -
バケットに対するストレージ管理者 ロールを割り当てます。 SERVICE_ACCOUNT と BUCKET_NAME を置き換えて、 次のコマンドを実行します。
gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \ gs://BUCKET_NAME -
(Cloud Run functions(第 2 世代)の場合)サービス アカウントに Cloud Run 起動元 ロールを割り当てます。 PROJECT_ID と SERVICE_ACCOUNT を置き換えて、次のコマンドを実行します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/run.invoker
App Engine のデフォルトのサービス アカウントを無効にするか削除すると、App Engine アプリから Firestore データベースにアクセスできなくなります。 無効にした App Engine サービス アカウントは、再有効化できます。サービス アカウントの有効化をご覧ください。App Engine のサービス アカウントを削除しても、その削除が過去 30 日以内であれば サービス アカウントを復元できます。 サービス アカウントの削除の取り消しをご覧ください。
Cloud Scheduler ジョブと Cloud Function をテストする
コンソールの [Cloud Scheduler] ページで、Cloud Scheduler ジョブをテストできます。 Google Cloud
コンソールで、[Cloud Scheduler] ページに移動します。 Google Cloud
Cloud Scheduler に移動新しく作成した Cloud Scheduler ジョブの行で、[今すぐ実行] をクリックします。
数秒後、Cloud Scheduler ジョブによって結果列が [成功] に更新され、[前回の実行] が現在の時刻に更新されるはずです。[更新] をクリックしなければならない場合があります。
[Cloud Scheduler] ページで確認できるのは、ジョブが Cloud 関数を呼び出したことだけです。関数のログを確認するには、Cloud 関数のページを開く必要があります。
Cloud 関数のログを確認する
Cloud Function がエクスポート オペレーションを正常に開始したかどうかを確認するには、関数のログを開きます。
Firebase コンソール
Firebase コンソールで、[Hosting / サーバーレス] > [Functions] に移動します。
GCP Console
コンソールの [Cloud Run functions] ページに移動します。 Google Cloud
エクスポートの進行状況を確認する
gcloud firestore operations list コマンドを使用すると、エクスポート オペレーションの進行状況を確認できます。エクスポート / インポート オペレーションの管理をご覧ください。
エクスポート オペレーションの完了後は、Cloud Storage バケット内の出力ファイルを表示できます。