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

プロジェクト間でデータを移動する

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

このページでは、マネージド インポートおよびエクスポート機能を使用して、Cloud Firestore データをあるプロジェクトから別のプロジェクトに移動する方法について説明します。これは、開発環境をセットアップする場合や、アプリを別のプロジェクトに完全に移行する場合に役立ちます。このページの例は、ソース プロジェクトからデータをエクスポートし、そのデータを宛先プロジェクトにインポートする方法を示しています。プロジェクト間でのデータの移動には、次の手順が含まれます。

  1. ソース プロジェクトのデータを保持する Cloud Storage バケットを作成します。
  2. ソース プロジェクトからバケットにデータをエクスポートします。
  3. 宛先プロジェクトに、バケットから読み取る権限を付与します。
  4. バケットから宛先プロジェクトにデータをインポートします。

あなたが始める前に

マネージド エクスポートおよびインポート サービスを使用する前に、次のタスクを完了する必要があります。

  1. ソース プロジェクトと宛先プロジェクトの両方で課金を有効にします。エクスポートおよびインポート機能を使用できるのは、課金が有効になっている Google Cloud プロジェクトのみです。
  2. ソース プロジェクトと宛先プロジェクトで必要な Cloud IAM 権限がアカウントにあることを確認します。両方のプロジェクトのプロジェクト オーナーである場合、アカウントには必要な権限があります。それ以外の場合は、次の Cloud IAM ロールによって、Cloud Firestore のエクスポートおよびインポート オペレーションに必要な権限が付与されます。

    OwnerCloud Datastore Owner 、またはCloud Datastore Import Export Admin

    プロジェクト オーナーは、アクセス権の付与の手順に従って、これらのロールのいずれかを付与できます。

  3. gcloudコマンドライン ツールをセットアップし、次のいずれかの方法でプロジェクトに接続します。

  4. 新しいプロジェクトにインデックスを設定します。複合インデックスは、ソース プロジェクトと宛先プロジェクトの間で一致する必要があります。各ドキュメントを複数回処理する必要がないように、最初にインデックスを設定する必要があります。

ソース プロジェクトからデータをエクスポートする

Cloud Firestore エクスポート ファイル用の Cloud Storage バケットを作成し、エクスポート オペレーションを開始して、データをエクスポートします。

Cloud Storage バケットを作成する

Cloud Firestore データベースと同じ場所にCloud Storage バケットを作成します。データベースの場所を表示するには、プロジェクトの場所の設定を参照してください。リクエスタ支払いバケットをエクスポートおよびインポート操作に使用することはできません。

Cloud Storage バケットがソース プロジェクトにない場合は、ソース プロジェクトのデフォルトのサービス アカウントにバケットへのアクセス権を付与する必要があります。各 Google Cloud プロジェクトには、 PROJECT_ID @appspot.gserviceaccount.comという名前のデフォルト サービス アカウントが自動的に作成されます。 Cloud Firestore のエクスポート オペレーションでは、このデフォルトのサービス アカウントを使用して Cloud Storage バケットのオペレーションを承認します。デフォルトのサービス アカウントにソース バケットへのアクセス権を付与するには、 Storage Adminの役割を付与します。

Cloud Shell で利用可能なgsutilツールを使用して、この役割を付与できます。

クラウド シェルを開始する

gsutil iam ch serviceAccount:[SOURCE_PROJECT_ID]@appspot.gserviceaccount.com:admin \
gs://[BUCKET_NAME]

この役割は、Google Cloud Console で付与することもできます。

書き込み操作を無効にする (オプション)

エクスポート操作の実行中にアプリがデータベースへの書き込みを続ける場合、それらの書き込みのすべてがエクスポート ファイルに取り込まれない可能性があります。一貫した状態からデータをエクスポートするには、セキュリティ ルールを更新し、Admin SDK 操作を停止して、データベースへの書き込みを無効にします。

  1. セキュリティ ルールを更新する

    コンソールの Cloud Firestoreルールタブで、ソース プロジェクトのセキュリティ ルールを更新して、すべての書き込みを拒否します。例えば:

      // Deny write access to all users under any conditions
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow write: if false;
          }
          // Reads do not affect export operations
          // Add your read rules here
        }
      }
    
  2. Admin SDK からの書き込みを停止する

    セキュリティ ルールは、 Firebase Admin SDKまたはGoogle Cloud Server Client Libraryを使用して作成された特権サーバー環境からの書き込みを停止しません。サーバーをシャットダウンまたは更新して、管理サーバーからの書き込み操作を停止してください。

エクスポート操作を開始する

ソース プロジェクトからデータをエクスポートするには、 gcloud firestore exportコマンドを使用します。すべてのデータまたは特定のコレクションのみをエクスポートできます。 [SOURCE_BUCKET]を Cloud Storage バケットの名前に置き換えます。

すべてのデータをエクスポート
gcloud firestore export gs://[SOURCE_BUCKET] --async
特定のコレクションをエクスポートする
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

後で使用するため、エクスポート操作のoutputURIPrefixをメモしておいてください。デフォルトでは、Cloud Firestore はタイムスタンプに基づいてエクスポート ファイルにプレフィックスを追加します。

outputUriPrefix: gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418

エクスポート オペレーションの実行中に、 firestore operations listコマンドを使用してオペレーションの進行状況を表示できます。

gcloud firestore operations list

データを宛先プロジェクトにインポートする

次に、宛先プロジェクトに Cloud Firestore データ ファイルへのアクセス権を付与し、インポート オペレーションを開始します。

データ ファイルへのアクセス権を宛先プロジェクトに付与する

インポート操作を開始する前に、宛先プロジェクトが Cloud Firestore データ ファイルにアクセスできることを確認する必要があります。

データ ファイルをローカル バケットに移動する

ソース バケットの場所が宛先プロジェクトの Cloud Firestore の場所と異なる場合は、データ ファイルを宛先プロジェクトと同じ場所にある Cloud Storage バケットに移動する必要があります。

バケットの移動と名前変更の手順に従って、データ ファイルを別の Cloud Storage バケットに移動します。以降のすべての手順で、この新しいバケットを[SOURCE_BUCKET]として使用します。

プロジェクト サービス アカウントにソース バケットへのアクセス権を付与します

ソース バケットが宛先プロジェクトにない場合は、宛先プロジェクトのデフォルト サービス アカウントにソース バケットへのアクセス権を付与する必要があります。デフォルトのサービス アカウントの名前は[DESTINATION_PROJECT_ID] @appspot.gserviceaccount.comです。デフォルトのサービス アカウントにソース バケットへのアクセス権を付与するには、バケットにアクセスするための適切な権限を付与します。

Cloud Shell で利用可能なgsutilツールを使用して、必要なロールを付与できます。

クラウド シェルを開始する

gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:legacyBucketReader,legacyObjectReader \
gs://[SOURCE_BUCKET]

この役割は、Google Cloud コンソールで付与することもできます。

インポート操作を開始する

インポート操作を開始する前に、 gcloudが正しいプロジェクト用に構成されていることを確認してください。

gcloud config set project [DESTINATION_PROJECT_ID]

gcloud firestore importコマンドを使用して、ソース バケットのデータを宛先プロジェクトにインポートします。

gcloud firestore import gs://[SOURCE_BUCKET]/[EXPORT_PREFIX] --async

[EXPORT_PREFIX]は、エクスポート操作のoutputUriPrefixのプレフィックスと一致します。例えば:

gcloud firestore import gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418 --async

エクスポート オペレーションの実行中に、 firestore operations listコマンドを使用してオペレーションの進行状況を表示できます。

gcloud firestore operations list

このページでは、マネージド インポートおよびエクスポート機能を使用して、Cloud Firestore データをあるプロジェクトから別のプロジェクトに移動する方法について説明します。これは、開発環境をセットアップする場合や、アプリを別のプロジェクトに完全に移行する場合に役立ちます。このページの例は、ソース プロジェクトからデータをエクスポートし、そのデータを宛先プロジェクトにインポートする方法を示しています。プロジェクト間でのデータの移動には、次の手順が含まれます。

  1. ソース プロジェクトのデータを保持する Cloud Storage バケットを作成します。
  2. ソース プロジェクトからバケットにデータをエクスポートします。
  3. 宛先プロジェクトに、バケットから読み取る権限を付与します。
  4. バケットから宛先プロジェクトにデータをインポートします。

あなたが始める前に

マネージド エクスポートおよびインポート サービスを使用する前に、次のタスクを完了する必要があります。

  1. ソース プロジェクトと宛先プロジェクトの両方で課金を有効にします。エクスポートおよびインポート機能を使用できるのは、課金が有効になっている Google Cloud プロジェクトのみです。
  2. ソース プロジェクトと宛先プロジェクトで必要な Cloud IAM 権限がアカウントにあることを確認します。両方のプロジェクトのプロジェクト オーナーである場合、アカウントには必要な権限があります。それ以外の場合は、次の Cloud IAM ロールによって、Cloud Firestore のエクスポートおよびインポート オペレーションに必要な権限が付与されます。

    OwnerCloud Datastore Owner 、またはCloud Datastore Import Export Admin

    プロジェクト オーナーは、アクセス権の付与の手順に従って、これらのロールのいずれかを付与できます。

  3. gcloudコマンドライン ツールをセットアップし、次のいずれかの方法でプロジェクトに接続します。

  4. 新しいプロジェクトにインデックスを設定します。複合インデックスは、ソース プロジェクトと宛先プロジェクトの間で一致する必要があります。各ドキュメントを複数回処理する必要がないように、最初にインデックスを設定する必要があります。

ソース プロジェクトからデータをエクスポートする

Cloud Firestore エクスポート ファイル用の Cloud Storage バケットを作成し、エクスポート オペレーションを開始して、データをエクスポートします。

Cloud Storage バケットを作成する

Cloud Firestore データベースと同じ場所にCloud Storage バケットを作成します。データベースの場所を表示するには、プロジェクトの場所の設定を参照してください。リクエスタ支払いバケットをエクスポートおよびインポート操作に使用することはできません。

Cloud Storage バケットがソース プロジェクトにない場合は、ソース プロジェクトのデフォルトのサービス アカウントにバケットへのアクセス権を付与する必要があります。各 Google Cloud プロジェクトには、 PROJECT_ID @appspot.gserviceaccount.comという名前のデフォルト サービス アカウントが自動的に作成されます。 Cloud Firestore のエクスポート オペレーションでは、このデフォルトのサービス アカウントを使用して Cloud Storage バケットのオペレーションを承認します。デフォルトのサービス アカウントにソース バケットへのアクセス権を付与するには、 Storage Adminの役割を付与します。

Cloud Shell で利用可能なgsutilツールを使用して、この役割を付与できます。

クラウド シェルを開始する

gsutil iam ch serviceAccount:[SOURCE_PROJECT_ID]@appspot.gserviceaccount.com:admin \
gs://[BUCKET_NAME]

この役割は、Google Cloud Console で付与することもできます。

書き込み操作を無効にする (オプション)

エクスポート操作の実行中にアプリがデータベースへの書き込みを続ける場合、それらの書き込みのすべてがエクスポート ファイルに取り込まれない可能性があります。一貫した状態からデータをエクスポートするには、セキュリティ ルールを更新し、Admin SDK 操作を停止して、データベースへの書き込みを無効にします。

  1. セキュリティ ルールを更新する

    コンソールの Cloud Firestoreルールタブで、ソース プロジェクトのセキュリティ ルールを更新して、すべての書き込みを拒否します。例えば:

      // Deny write access to all users under any conditions
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow write: if false;
          }
          // Reads do not affect export operations
          // Add your read rules here
        }
      }
    
  2. Admin SDK からの書き込みを停止する

    セキュリティ ルールは、 Firebase Admin SDKまたはGoogle Cloud Server Client Libraryを使用して作成された特権サーバー環境からの書き込みを停止しません。サーバーをシャットダウンまたは更新して、管理サーバーからの書き込み操作を停止してください。

エクスポート操作を開始する

ソース プロジェクトからデータをエクスポートするには、 gcloud firestore exportコマンドを使用します。すべてのデータまたは特定のコレクションのみをエクスポートできます。 [SOURCE_BUCKET]を Cloud Storage バケットの名前に置き換えます。

すべてのデータをエクスポート
gcloud firestore export gs://[SOURCE_BUCKET] --async
特定のコレクションをエクスポートする
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

後で使用するため、エクスポート操作のoutputURIPrefixをメモしておいてください。デフォルトでは、Cloud Firestore はタイムスタンプに基づいてエクスポート ファイルにプレフィックスを追加します。

outputUriPrefix: gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418

エクスポート オペレーションの実行中に、 firestore operations listコマンドを使用してオペレーションの進行状況を表示できます。

gcloud firestore operations list

データを宛先プロジェクトにインポートする

次に、宛先プロジェクトに Cloud Firestore データ ファイルへのアクセス権を付与し、インポート オペレーションを開始します。

データ ファイルへのアクセス権を宛先プロジェクトに付与する

インポート操作を開始する前に、宛先プロジェクトが Cloud Firestore データ ファイルにアクセスできることを確認する必要があります。

データ ファイルをローカル バケットに移動する

ソース バケットの場所が宛先プロジェクトの Cloud Firestore の場所と異なる場合は、データ ファイルを宛先プロジェクトと同じ場所にある Cloud Storage バケットに移動する必要があります。

バケットの移動と名前変更の手順に従って、データ ファイルを別の Cloud Storage バケットに移動します。以降のすべての手順で、この新しいバケットを[SOURCE_BUCKET]として使用します。

プロジェクト サービス アカウントにソース バケットへのアクセス権を付与します

ソース バケットが宛先プロジェクトにない場合は、宛先プロジェクトのデフォルト サービス アカウントにソース バケットへのアクセス権を付与する必要があります。デフォルトのサービス アカウントの名前は[DESTINATION_PROJECT_ID] @appspot.gserviceaccount.comです。デフォルトのサービス アカウントにソース バケットへのアクセス権を付与するには、バケットにアクセスするための適切な権限を付与します。

Cloud Shell で利用可能なgsutilツールを使用して、必要なロールを付与できます。

クラウド シェルを開始する

gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:legacyBucketReader,legacyObjectReader \
gs://[SOURCE_BUCKET]

この役割は、Google Cloud コンソールで付与することもできます。

インポート操作を開始する

インポート操作を開始する前に、 gcloudが正しいプロジェクト用に構成されていることを確認してください。

gcloud config set project [DESTINATION_PROJECT_ID]

gcloud firestore importコマンドを使用して、ソース バケットのデータを宛先プロジェクトにインポートします。

gcloud firestore import gs://[SOURCE_BUCKET]/[EXPORT_PREFIX] --async

[EXPORT_PREFIX]は、エクスポート操作のoutputUriPrefixのプレフィックスと一致します。例えば:

gcloud firestore import gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418 --async

エクスポート オペレーションの実行中に、 firestore operations listコマンドを使用してオペレーションの進行状況を表示できます。

gcloud firestore operations list