Planifier des exportations de données

Cette page explique comment planifier les exportations de vos données Cloud Firestore. Pour exécuter des exportations selon un calendrier, nous vous recommandons d'utiliser Cloud Functions et Cloud Scheduler.

Avant de commencer

Avant de planifier l'exportation des données gérées, vous devez effectuer les tâches suivantes :

  1. Activez la facturation pour votre projet Google Cloud. Seuls les projets Google Cloud pour lesquels la facturation est activée peuvent utiliser la fonctionnalité d'exportation et d'importation.
  2. Les opérations d'exportation nécessitent un bucket Cloud Storage de destination. Créez un bucket Cloud Storage dans un emplacement proche de l'emplacement de votre base de données Cloud Firestore. Vous ne pouvez pas utiliser un bucket Requester Pays pour les opérations d'exportation.

Créer une fonction Cloud et un job Cloud Scheduler

Pour créer une fonction Cloud Node.js qui lance une exportation de données Cloud Firestore et un job Cloud Scheduler pour appeler cette fonction, procédez comme suit :

CLI Firebase
  1. Installez la CLI Firebase. Dans un nouveau répertoire, initialisez la CLI pour Cloud Functions :

    firebase init functions --project PROJECT_ID
    1. Sélectionnez le langage JavaScript.
    2. Vous pouvez également activer ESLint.
    3. Saisissez y pour installer les dépendances.
  2. Remplacez le code du fichier functions/index.js par le code suivant :

    const functions = require('firebase-functions');
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME';
    
    exports.scheduledFirestoreExport = functions.pubsub
                                                .schedule('every 24 hours')
                                                .onRun((context) => {
    
      const projectId = process.env.GCP_PROJECT;
      const databaseName = 
        client.databasePath(projectId, '(default)');
    
      return client.exportDocuments({
        name: databaseName,
        outputUriPrefix: bucket,
        // Leave collectionIds empty to export all collections
        // or set to a list of collection IDs to export,
        // collectionIds: ['users', 'posts']
        collectionIds: []
        })
      .then(responses => {
        const response = responses[0];
        console.log(`Operation Name: ${response['name']}`);
      })
      .catch(err => {
        console.error(err);
        throw new Error('Export operation failed');
      });
    });
  3. Dans le code précédent, modifiez les éléments suivants :
    • Remplacez BUCKET_NAME par le nom de votre bucket.
    • Remplacez YOUR_PROJECT_ID par l'ID de votre projet.
    • Modifiez every 24 hours pour définir votre calendrier d'exportation. Utilisez la syntaxe AppEngine cron.yaml ou le format unix-cron (* * * * *).
    • Modifiez collectionIds: [] pour n'exporter que les groupes de collections spécifiés. Laissez ce champ vide pour exporter tous les groupes de collections.

  4. Déployez la fonction planifiée :

    firebase deploy --only functions
Console Google Cloud
Créer une fonction Cloud
  1. Accédez à la page Cloud Functions dans la console Google Cloud :

    Accéder à Cloud Functions

  2. Cliquez sur Écrire une fonction.
  3. Saisissez un nom de fonction tel que firestore-export
  4. Sous Déclencheur, sélectionnez Cloud Pub/Sub
  5. Sous Sujet, sélectionnez Créer un sujet. Saisissez un nom pour le sujet Pub/Sub, par exemple initiateFirestoreExport. Notez le nom du sujet, car vous en aurez besoin pour créer votre job Cloud Scheduler.
  6. Sous Code source, sélectionnez Éditeur intégré. Saisissez le code suivant sous index.js :
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME'
    
    exports.scheduledFirestoreExport = (event, context) => {
      // Access the GCLOUD_PROJECT environment variable set by the runtime.
      const projectId =
        process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;
      // Use the DATABASE_ID environment variable if set,
      // otherwise default to '(default)'
      const databaseId = process.env.DATABASE_ID || '(default)';
      const databaseName = client.databasePath(
        projectId,
        databaseId
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collection groups
          // or define a list of collection group IDs:
          // collectionIds: ['users', 'posts']
          collectionIds: [],
        })
        .then(responses => {
          const response = responses[0];
          console.log(`Operation Name: ${response['name']}`);
          return response;
        })
        .catch(err => {
          console.error(err);
        });
    };
    Dans le code précédent, modifiez les éléments suivants :
    • Remplacez BUCKET_NAME par le nom de votre bucket.
    • Modifiez collectionIds: [] pour n'exporter que les groupes de collections spécifiés. Laissez ce champ vide pour exporter tous les groupes de collections.

    • (Facultatif) Si vous utilisez une base de données autre que celle par défaut, veillez à définir la variable d'environnement DATABASE_ID lors de la création de la fonction Cloud. Si vous utilisez un environnement d'exécution dans lequel GOOGLE_CLOUD_PROJECT n'est pas défini automatiquement, vous devrez peut-être le définir manuellement ou le remplacer par l'ID de votre projet dans le code.

  7. Sous package.json, ajoutez la dépendance suivante :
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. Sous Fonction à exécuter, saisissez scheduledFirestoreExport, le nom de la fonction dans index.js.
  9. Cliquez sur Créer pour déployer la fonction Cloud.
Créer un job Cloud Scheduler

Ensuite, créez un job Cloud Scheduler qui appelle votre fonction Cloud :

  1. Accédez à la page Cloud Scheduler de la console Google Cloud :

    Accéder à Cloud Scheduler

  2. Cliquez sur Créer une tâche.
  3. Saisissez un Nom pour la tâche, par exemple scheduledFirestoreExport.
  4. Saisissez une fréquence, par exemple every 24 hours.
  5. Sélectionnez un Fuseau horaire.
  6. Sous Cible, sélectionnez Pub/Sub. Dans le champ Sujet, saisissez le nom du sujet Pub/Sub que vous avez défini avec votre fonction Cloud, initiateFirestoreExport dans l'exemple précédent.
  7. Dans le champ Charge utile, saisissez start export. Le job nécessite une charge utile définie, mais la fonction Cloud précédente n'utilise pas réellement cette valeur.
  8. Cliquez sur Créer.
À ce stade, vous avez déployé votre fonction Cloud et votre tâche Cloud Scheduler, mais votre fonction Cloud a toujours besoin d'autorisations d'accès pour exécuter des opérations d'exportation.

Configurer les autorisations d'accès

Vous devez ensuite attribuer une autorisation à la fonction Cloud pour lancer les opérations d'exportation et écrire dans votre bucket GCS.

Cette fonction Cloud Run utilise un compte de service pour authentifier et autoriser ses opérations d'exportation. Le compte de service utilisé dépend de votre configuration Cloud Functions :

  • Cloud Functions (1re génération) : utilise le compte de service par défaut App Engine : PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (2e génération) : utilise le compte de service Compute Engine par défaut : PROJECT_NUMBER-compute@developer.gserviceaccount.com

Ce compte de service doit être autorisé à démarrer une opération d'exportation et à écrire dans votre bucket Cloud Storage. Pour accorder ces autorisations, attribuez les rôles IAM suivants au compte de service :

  • Cloud Datastore Import Export Admin
  • Rôle Storage Admin sur le bucket
  • Cloud Run Invoker (obligatoire pour Cloud Functions (2nd gen) afin de permettre au service de déclenchement d'appeler la fonction)

Vous pouvez utiliser les outils de ligne de commande gcloud et gsutil pour attribuer ces rôles.

Si vous ne les avez pas encore installés, vous pouvez accéder à ces outils depuis Cloud Shell dans la console Google Cloud :
Démarrer Cloud Shell

  1. Attribuez le rôle Administrateur des importations et des exportations Cloud Datastore. Remplacez PROJECT_ID et SERVICE_ACCOUNT (par exemple, PROJECT_ID@appspot.gserviceaccount.com ou PROJECT_NUMBER-compute@developer.gserviceaccount.com), puis exécutez la commande suivante :

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/datastore.importExportAdmin
  2. Attribuez le rôle Administrateur de l'espace de stockage sur votre bucket. Remplacez SERVICE_ACCOUNT et BUCKET_NAME, puis exécutez la commande suivante :

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (Pour Cloud Functions (2e génération)) Attribuez le rôle Demandeur Cloud Run au compte de service. Remplacez PROJECT_ID et SERVICE_ACCOUNT, puis exécutez la commande suivante :

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/run.invoker

Si vous désactivez ou supprimez votre compte de service par défaut App Engine, votre application App Engine n'aura plus accès à votre base de données Cloud Firestore. Si vous avez désactivé votre compte de service App Engine, vous pouvez le réactiver. Consultez Activer un compte de service. Si vous avez supprimé votre compte de service App Engine au cours des 30 derniers jours, vous pouvez le restaurer. Consultez Annuler la suppression d'un compte de service.

Tester votre job Cloud Scheduler et votre fonction Cloud

Vous pouvez tester votre job Cloud Scheduler sur la page Cloud Scheduler de la console Google Cloud.

  1. Accédez à la page Cloud Scheduler dans la console Google Cloud.
    Accéder à Cloud Scheduler

  2. Sur la ligne correspondant à votre nouvelle tâche Cloud Scheduler, cliquez sur Exécuter maintenant.

    Après quelques secondes, le job Cloud Scheduler devrait mettre à jour la colonne de résultat sur Réussite et la colonne Dernière exécution sur l'heure actuelle. Vous devrez peut-être cliquer sur Actualiser.

La page Cloud Scheduler confirme uniquement que le job a appelé votre fonction Cloud. Ouvrez la page Fonction Cloud pour afficher les journaux de votre fonction.

Afficher les journaux Cloud Functions

Pour vérifier si la fonction Cloud a correctement démarré une opération d'exportation, ouvrez les journaux de la fonction :

Console Firebase

Dans la console Firebase, accédez à Hosting et sans serveur > Functions.

Accéder aux journaux de la fonction

Console GCP

Accédez à la page Cloud Functions dans la console Google Cloud.

Accéder à la visionneuse de journaux

Afficher la progression de l'exportation

Vous pouvez utiliser la commande gcloud firestore operations list pour afficher la progression de vos opérations d'exportation. Voir Gestion des opérations d'exportation et d'importation.

Une fois l'opération d'exportation terminée, vous pouvez afficher les fichiers de sortie dans votre bucket Cloud Storage :

Ouvrir le navigateur Cloud Storage