Déplacer des données entre des projets

Cette page explique comment utiliser les fonctionnalités d'importation et d'exportation gérées pour transférer des données Firestore d'un projet à un autre. Cela peut être utile pour la configuration d'un environnement de développement ou dans le cadre de la migration permanente d'une application vers un autre projet. L'exemple présenté sur cette page montre comment exporter des données à partir d'un projet source, puis les réimporter dans un projet de destination. Pour déplacer des données d'un projet à l'autre, procédez comme suit :

  1. Créez un bucket Cloud Storage pour stocker les données de votre projet source.
  2. Exportez les données de votre projet source vers le bucket.
  3. Accordez à votre projet de destination l'accès en lecture à partir du bucket.
  4. Importez les données du bucket dans votre projet de destination.

Avant de commencer

Pour pouvoir utiliser le service d'exportation et d'importation géré, vous devez effectuer les tâches ci-dessous :

  1. Activez la facturation pour votre projet source et votre projet de destination. Seuls les projets Google Cloud pour lesquels la facturation est activée peuvent utiliser les fonctionnalités d'exportation et d'importation.
  2. Assurez-vous que votre compte dispose des autorisations IAM nécessaires dans votre projet source et votre projet de destination. Si vous êtes le propriétaire des deux projets, votre compte dispose des autorisations requises. Sinon, les rôles IAM suivants accordent les autorisations nécessaires pour les opérations d'importation et d'exportation Firestore :

    Owner, Cloud Datastore Owner ou Cloud Datastore Import Export Admin

    Un propriétaire de projet peut attribuer l'un de ces rôles en suivant les étapes de la section Accorder l'accès.

  3. Configurez l'outil de ligne de commande gcloud et connectez-vous à votre projet de l'une des manières suivantes :

  4. Configurez des index dans votre nouveau projet. Les index composites doivent correspondre entre les projets source et de destination. Les index doivent d'abord être configurés pour éviter d'avoir à traiter chaque document plusieurs fois.

Exporter les données du projet source

Exportez vos données en créant un bucket Cloud Storage pour vos fichiers d'exportation Firestore et en démarrant une opération d'exportation.

Créer un bucket Cloud Storage

Créez un bucket Cloud Storage à l'emplacement où se trouve votre base de données Firestore. Pour connaître la zone de votre base de données, consultez vos paramètres de localisation du projet. Vous ne pouvez pas utiliser de bucket "Paiements du demandeur" pour les opérations d'exportation et d'importation.

Si votre bucket Cloud Storage ne se trouve pas dans votre projet source, vous devez accorder au compte de service par défaut du projet source l'accès au bucket. Chaque projet Google Cloud dispose d'un compte de service par défaut créé automatiquement sous le nom PROJECT_ID@appspot.gserviceaccount.com. Les opérations d'exportation Firestore utilisent ce compte de service par défaut pour autoriser les opérations de bucket Cloud Storage. Pour accorder au compte de service par défaut l'accès à votre bucket source, attribuez-lui le rôle Storage Admin.

Vous pouvez attribuer ce rôle avec l'outil gsutil disponible dans Cloud Shell :

Démarrer Cloud Shell

gsutil iam ch serviceAccount:[service-PROJECT_NUMBER]@gcp-sa-firestore.iam.gserviceaccount.com :roles/storage.admin\
gs://[BUCKET_NAME]@

Vous pouvez également attribuer ce rôle dans Google Cloud Console.

Désactiver les opérations d'écriture (facultatif)

Si votre application continue à écrire dans votre base de données pendant que vous effectuez une opération d'exportation, vous risquez de ne pas capturer toutes ces écritures dans vos fichiers d'exportation. Pour exporter des données à partir d'un état cohérent, désactivez les écritures dans votre base de données en mettant à jour vos règles de sécurité et en interrompant les opérations du SDK Admin.

  1. Mettre à jour les règles de sécurité

    Dans l'onglet Règles Firestore de la console, mettez à jour les règles de sécurité de votre projet source pour refuser toutes les écritures. Exemple :

      // 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. Interrompre les écritures des SDK Admin

    Les règles de sécurité n'empêchent pas les écritures provenant d'environnements de serveurs privilégiés créés à l'aide d'un SDK Firebase Admin ou d'une bibliothèque cliente du serveur Google Cloud. Veillez à interrompre les opérations d'écriture depuis vos serveurs d'administration en fermant ou en mettant à jour vos serveurs.

Lancer une opération d'exportation

Utilisez la commande gcloud firestore export pour exporter les données de votre projet source. Vous pouvez exporter toutes vos données ou seulement certaines collections. Remplacez [SOURCE_BUCKET] par le nom de votre bucket Cloud Storage.

Exporter toutes les données
gcloud firestore export gs://[SOURCE_BUCKET] --async
Exporter des collections spécifiques
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

Notez le outputURIPrefix de votre opération d'exportation, car vous l'utiliserez ultérieurement. Par défaut, Firestore ajoute un préfixe à vos fichiers d'exportation en fonction d'un horodatage :

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

Lorsque l'opération d'exportation est en cours d'exécution, vous pouvez utiliser la commande firestore operations list pour afficher la progression de votre opération :

gcloud firestore operations list

Importer des données dans le projet de destination

Ensuite, accordez au projet de destination l'accès à vos fichiers de données Firestore et lancez une opération d'importation.

Accorder au projet de destination l'accès à vos fichiers de données

Avant de lancer une opération d'importation, vous devez vous assurer que votre projet de destination peut accéder à vos fichiers de données Firestore.

Déplacer des fichiers de données vers un bucket local

Si la zone du bucket source diffère de celle de votre projet de destination Firestore, vous devez déplacer vos fichiers de données vers un bucket Cloud Storage situé dans la même zone que votre projet de destination.

Déplacez vos fichiers de données vers un autre bucket Cloud Storage en suivant les étapes décrites dans la section Déplacer et renommer des buckets. Pour toutes les étapes suivantes, utilisez ce nouveau bucket en tant que [SOURCE_BUCKET].

Accorder au compte de service du projet l'accès à votre bucket source

Si votre bucket source n'est pas dans votre projet de destination, vous devez accorder au compte de service par défaut du projet de destination l'accès à votre bucket source. Le compte de service par défaut s'appelle [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com. Pour accorder au compte de service par défaut l'accès à votre bucket source, attribuez-lui les autorisations appropriées pour y accéder.

Vous pouvez attribuer les rôles nécessaires avec l'outil gsutil disponible dans Cloud Shell:

Démarrer Cloud Shell

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

Vous pouvez également attribuer ce rôle dans Google Cloud Console.

Lancer une opération d'importation

Avant de lancer l'importation, assurez-vous que gcloud est configuré pour le bon projet :

gcloud config set project [DESTINATION_PROJECT_ID]

Utilisez la commande gcloud firestore import pour importer les données de votre bucket source dans votre projet de destination :

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

[EXPORT_PREFIX] correspond au préfixe dans le outputUriPrefix de votre opération d'exportation. Exemple :

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

Lorsque l'opération d'exportation est en cours d'exécution, vous pouvez utiliser la commande firestore operations list pour afficher la progression de votre opération :

gcloud firestore operations list