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 déplacer des données Cloud 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 la fonctionnalité d'exportation et d'importation.
  2. Assurez-vous que votre compte dispose des autorisations Cloud IAM nécessaires dans votre projet source et votre projet de destination. Si vous êtes propriétaire des deux projets, votre compte dispose des autorisations requises. Sinon, les rôles Cloud IAM suivants accordent les autorisations nécessaires pour les opérations d'exportation et d'importation Cloud 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 décrites dans 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 Cloud Firestore et en lançant une opération d'exportation.

Créer un bucket Cloud Storage

Créez un bucket Cloud Storage au même emplacement que votre base de données Cloud Firestore. Pour afficher l'emplacement de votre base de données, consultez le paramètre d'emplacement de votre projet. Vous ne pouvez pas utiliser de bucket avec paiements du demandeur ni de bucket rapide pour les opérations d'exportation et d'importation.

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

Vous pouvez attribuer ce rôle à l'aide de 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 la console Google Cloud.

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 la console Firebase, accédez à l'onglet Bases de données et stockage > Firestore > Règles.

    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 certains groupes de 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 groupes de collections spécifiques
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_GROUP_ID_1],[COLLECTION_GROUP_ID_2] --async

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

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, autorisez le projet de destination à accéder à vos fichiers de données Cloud Firestore et lancez une opération d'importation.

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

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

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

Si l'emplacement de votre bucket source est différent de l'emplacement Cloud Firestore de votre projet de destination, vous devez déplacer vos fichiers de données vers un bucket Cloud Storage situé au même emplacement que votre projet de destination.

Déplacez vos fichiers de données vers un autre bucket Cloud Storage en suivant la procédure décrite dans la section Déplacer et renommer des buckets. Pour toutes les étapes suivantes, utilisez ce nouveau bucket comme [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 autoriser le compte de service par défaut à accéder à votre bucket source, accordez-lui les autorisations appropriées.

Vous pouvez attribuer les rôles nécessaires à l'aide de 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 la console Google Cloud.

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

Où [EXPORT_PREFIX] correspond au préfixe de l'élément 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