コンソールへ移動

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

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

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

準備

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

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

    OwnerCloud Datastore OwnerCloud Datastore Import Export Admin

    プロジェクト オーナーがアクセスの許可の手順に従ってこれらの役割のいずれかを付与します。

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

    • Cloud Shell を使用して、Google Cloud Platform Console から gcloud にアクセスします。

      Cloud Shell の起動

      正しいプロジェクトに gcloud が構成されていることを確認します。

      gcloud config set project [SOURCE_PROJECT_ID]
    • Google Cloud SDK をインストールして初期化します。

      gcloud beta コンポーネントがまだインストールされていない場合は、追加します。このコンポーネントには、Cloud Firestore のエクスポート コマンドとインポート コマンドが含まれています。

      gcloud components install beta

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

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

Cloud Storage バケットの作成

Cloud Firestore データベースと同じロケーションに Cloud Storage バケットを作成します。データベースのロケーションを確認するには、プロジェクトのロケーションの設定をご覧ください。エクスポートとインポート オペレーションには、リクエスト元による支払いバケットは使用できません。

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

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

Cloud Shell の起動

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

Google Cloud Platform 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 beta firestore export コマンドを使用します。すべてのデータをエクスポートすることも、特定のコレクションのみをエクスポートすることもできます。[SOURCE_BUCKET] を該当する Cloud Storage バケットの名前に置き換えます。

すべてのデータをエクスポートする
gcloud beta firestore export gs://[SOURCE_BUCKET] --async
特定のコレクションをエクスポートする
gcloud beta 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 beta firestore operations list

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

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

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

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

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

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

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

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

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

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

Cloud Shell の起動

gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:storage.admin \
gs://[SOURCE_BUCKET]

GCP Console でこの役割を付与することもできます。

インポート オペレーションを開始する

インポート オペレーションを開始する前に、gcloud が正しいプロジェクトに構成されていることを確認します。

gcloud config set project [DESTINATION_PROJECT_ID]

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

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

[EXPORT_PREFIX] は、エクスポート オペレーションの outputUriPrefix のプレフィックスと一致します。例:

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

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

gcloud beta firestore operations list