データのエクスポートをスケジュールする
このページでは、Firestore データのエクスポートをスケジュールする方法を説明します。スケジュールに基づいてエクスポートを実行するには、Cloud Run 関数と Cloud Scheduler を使用することをおすすめします。
始める前に
マネージド データ エクスポートをスケジュールする前に、次のタスクを完了する必要があります。
- Google Cloud プロジェクトに対する課金を有効にします。エクスポート機能とインポート機能を使用できるのは、課金が有効になっている Google Cloud プロジェクトのみです。
- エクスポート オペレーションには、エクスポート先の Cloud Storage バケットが必要です。お使いの Firestore データベースの場所に近いロケーションに、Cloud Storage バケットを作成します。エクスポート オペレーションには、リクエスト元による支払いバケットは使用できません。
Cloud Function の関数と Cloud Scheduler ジョブを作成する
以下の手順に従って、Firestore データ エクスポートを開始する Cloud Function の関数 Node.js と、それを呼び出す 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
を実際のバケット名で置き換えます。every 24 hours
を変更して目的のエクスポート スケジュールを設定します。AppEngine cron.yaml 構文または unix-cron 形式(* * * * *
)を使用してください。-
指定されたコレクション グループだけがエクスポートされるように
collectionIds: []
を変更します。すべてのコレクションをエクスポートする場合は、そのままにします。
-
スケジュール設定された関数をデプロイします。
firebase deploy --only functions
Google Cloud Console
Cloud 関数を作成
-
Google Cloud コンソールの [Cloud Functions] ページに移動します。
- [関数を作成] をクリックします。
- 関数名を入力します(例:
firestoreExport
)。 - [トリガー] で [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) => { 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: []
を変更します。すべてのコレクションをエクスポートする場合は、そのままにします。
package.json
に、次の依存関係を追加します。{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } }
- [実行する関数] に「
scheduledFirestoreExport
」と入力します。これは、index.js
内での関数の名前です。 - [作成] をクリックして Cloud 関数をデプロイします。
Cloud Scheduler ジョブを作成する
次に、Cloud 関数を呼び出す Cloud Scheduler ジョブを作成します。
-
Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
- [ジョブを作成] をクリックします。
- [名前] にジョブの名前を入力します(例:
scheduledFirestoreExport
)。 - [頻度] に入力します(例:
every 24 hours
)。 - [タイムゾーン] でタイムゾーンを選択します。
- [ターゲット] で [Pub/Sub] を選択します。[トピック] フィールドに、Cloud 関数とともに定義した Pub/Sub トピックの名前を入力します。上記の例では、
initiateFirestoreExport
です。 - [ペイロード] フィールドに「
start export
」と入力します。ジョブにはペイロードを定義する必要がありますが、上記の Cloud 関数で実際にこの値が使用されることはありません。 - [作成] をクリックします。
アクセス権限を構成する
次は、Cloud 関数に、エクスポート オペレーションを開始する権限と GCS バケットに書き込む権限を付与します。
この Cloud 関数は、プロジェクトのデフォルト サービス アカウントを使用して、エクスポート オペレーションを認証および承認します。プロジェクトを作成すると、次の名前のデフォルト サービス アカウントが作成されます。
PROJECT_ID@appspot.gserviceaccount.com
このサービス アカウントには、エクスポート オペレーションを開始する権限と、Cloud Storage バケットに書き込む権限が必要です。これらの権限を付与するには、次の IAM ロールをデフォルトのサービス アカウントに割り当てます。
Cloud Datastore Import Export Admin
- バケットに対する
Owner
ロールまたはStorage Admin
ロール
gcloud
および gsutil
コマンドライン ツールを使用して、これらの役割を割り当てることができます。
これらのツールがまだインストールされていない場合は、Google Cloud Console の Cloud Shell からアクセスできます。
Cloud Shell の起動
-
Cloud Datastore インポート / エクスポート管理者ロールを割り当てます。PROJECT_ID を実際のプロジェクト ID で置き換えて、次のコマンドを実行します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/datastore.importExportAdmin
-
バケットに対するストレージ管理者ロールを割り当てます。PROJECT_ID と BUCKET_NAME を実際のプロジェクト ID、バケット名で置き換えて、次のコマンドを実行します。
gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \ gs://BUCKET_NAME
App Engine のデフォルトのサービス アカウントを無効にするか削除すると、App Engine アプリから Firestore データベースにアクセスできなくなります。無効にした App Engine サービス アカウントは、再有効化できます。サービス アカウントの有効化をご覧ください。App Engine のサービス アカウントを削除しても、その削除が過去 30 日以内であればサービス アカウントを復元できます。サービス アカウントの削除の取り消しをご覧ください。
Cloud Scheduler ジョブと Cloud 関数をテストする
Google Cloud Console の [Cloud Scheduler] ページで、Cloud Scheduler ジョブをテストできます。
Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
Cloud Scheduler に移動新しく作成した Cloud Scheduler ジョブの行で、[今すぐ実行] をクリックします。
数秒後、Cloud Scheduler ジョブによって結果列が [成功] に更新され、[前回の実行] が現在の時刻に更新されるはずです。[更新] をクリックしなければならない場合があります。
[Cloud Scheduler] ページで確認できるのは、ジョブが Cloud 関数を呼び出したことだけです。関数のログを確認するには、Cloud 関数のページを開く必要があります。
Cloud 関数のログを確認する
Cloud 関数がエクスポート オペレーションを正常に開始したかどうかを確認するには、関数のログを開きます。
Firebase コンソール
Firebase コンソールの [Cloud Run 関数] のページに移動します。
GCP Console
Google Cloud コンソールの [Cloud Run 関数] ページに移動します。
エクスポートの進行状況を確認する
gcloud firestore operations list
コマンドを使用すると、エクスポート オペレーションの進行状況を確認できます。エクスポート / インポート オペレーションの管理をご覧ください。
エクスポート オペレーションの完了後は、Cloud Storage バケット内の出力ファイルを表示できます。