Déplacer des données entre projets

Cette page décrit comment utiliser les fonctionnalités d'importation et d'exportation gérées pour déplacer les données Cloud Firestore d'un projet à un autre. Cela peut être utile pour mettre en place un environnement de développement ou dans le cadre de la migration permanente d'une application vers un autre projet. L'exemple de cette page montre comment exporter des données d'un projet source, puis importer ces données dans un projet de destination. Le déplacement de données entre projets implique les étapes suivantes :

  1. Créez un bucket Cloud Storage pour contenir les données de votre projet source.
  2. Exportez les données de votre projet source vers le bucket.
  3. Donnez à votre projet de destination la permission de lire à partir du compartiment.
  4. Importez les données du bucket dans votre projet de destination.

Avant que tu commences

Avant de pouvoir utiliser le service d'exportation et d'importation géré, vous devez effectuer les tâches suivantes :

  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 de projet pour les 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 accorder 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 être configurés en premier 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 démarrant 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 un bucket Requester Pay 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 avec le nom 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 du bucket Cloud Storage. Pour accorder au compte de service par défaut l'accès à votre bucket source, accordez-lui le rôle Storage Admin .

Vous pouvez accorder 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 accorder ce rôle dans la console Google Cloud .

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

Si votre application continue d'é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 arrêtant toutes les opérations du SDK Admin.

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

    Dans l' onglet Règles Cloud Firestore de la console, mettez à jour les règles de sécurité de votre projet source pour refuser toutes les écritures. Par 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. Arrêter les écritures à partir des SDK d'administration

    Les règles de sécurité n'empêchent pas les écritures provenant d'environnements de serveur privilégiés créés à l'aide d'un SDK d'administration Firebase ou d'une bibliothèque cliente Google Cloud Server . Assurez-vous d'arrêter les opérations d'écriture de vos serveurs d'administration en arrêtant ou en mettant à jour vos serveurs.

Commencer 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 uniquement des collections spécifiques. 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

Prenez note du outputURIPrefix de votre opération d'exportation, car vous l'utiliserez plus tard. Par défaut, Cloud Firestore ajoute un préfixe à vos fichiers d'exportation en fonction d'un horodatage :

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

Pendant l'exécution de l'opération d'exportation, 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 Cloud Firestore et démarrez une opération d'importation.

Donnez 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 les fichiers de données vers un bucket local

Si l'emplacement de votre compartiment 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 compartiment Cloud Storage au même emplacement 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 Déplacer et renommer des buckets . Pour toutes les étapes suivantes, utilisez ce nouveau compartiment comme [SOURCE_BUCKET] .

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

Si votre compartiment source ne se trouve pas dans votre projet de destination, vous devez alors accorder au compte de service par défaut du projet de destination l'accès à votre compartiment source. Le compte de service par défaut est nommé [DESTINATION_PROJECT_ID] @appspot.gserviceaccount.com . Pour donner au compte de service par défaut l'accès à votre compartiment source, accordez-lui les autorisations appropriées pour accéder au compartiment.

Vous pouvez accorder 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 accorder ce rôle dans la console Google Cloud .

Commencer une opération d'importation

Avant de lancer l'opération d'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 outputUriPrefix de votre opération d'exportation. Par exemple:

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

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

gcloud firestore operations list