Programmer une exportation

Cette page explique comment planifier des exportations de vos données Firestore en mode Datastore. Pour exécuter des exportations selon un calendrier, nous vous recommandons d'utiliser Cloud Functions et Cloud Scheduler. Créez une fonction Cloud qui lance les exportations et utilisez Cloud Scheduler pour exécuter votre fonction.

Avant de commencer

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

  1. Activer 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. Créer un bucket Cloud Storage dans un emplacement proche de celui où se trouve votre base de données Cloud Firestore en mode Datastore. Les opérations d'exportation nécessitent un bucket Cloud Storage de destination. Vous ne pouvez pas utiliser de bucket "paiements du demandeur" pour les opérations d'exportation.

Créer une fonction Cloud et une tâche Cloud Scheduler

Pour créer une fonction Cloud qui lance les exportations de données, ainsi qu'une tâche Cloud Scheduler pour appeler cette fonction, procédez comme suit :

Créez une fonction Cloud datastore_export.

  1. Ouvrez la page Cloud Functions dans Cloud Console :

    Ouvrir la page Cloud Functions

  2. Cliquez sur Créer une fonction
  3. Saisissez un nom de fonction tel que datastoreExport
  4. Sous Déclencheur, sélectionnez Cloud Pub/Sub. Cloud Scheduler utilise votre sujet Pub/Sub pour appeler votre fonction.
  5. Dans le champ Sujet, sélectionnez Créer un sujet. Saisissez un nom pour le sujet Pub/Sub, par exemple startDatastoreExport. Notez le nom du sujet car vous en aurez besoin pour créer votre tâche Cloud Scheduler.
  6. Sous Code source, sélectionnez Éditeur intégré.
  7. Dans la liste déroulante Environnement d'exécution, sélectionnez Python 3.7.
  8. Saisissez le code suivant pour main.py :
    # Copyright 2021 Google LLC All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    import base64
    import json
    import os
    
    from googleapiclient.discovery import build
    from googleapiclient.discovery_cache.base import Cache
    
    class MemoryCache(Cache):
        _CACHE = {}
    
        def get(self, url):
            return MemoryCache._CACHE.get(url)
    
        def set(self, url, content):
            MemoryCache._CACHE[url] = content
    
    # The default cache (file_cache) is unavailable when using oauth2client >= 4.0.0 or google-auth,
    # and it will log worrisome messages unless given another interface to use.
    datastore = build("datastore", "v1", cache=MemoryCache())
    project_id = os.environ.get("GCP_PROJECT")
    
    def datastore_export(event, context):
        """Triggers a Datastore export from a Cloud Scheduler job.
    
        Args:
            event (dict): event[data] must contain a json object encoded in
                base-64. Cloud Scheduler encodes payloads in base-64 by default.
                Object must include a 'bucket' value and can include 'kinds'
                and 'namespaceIds' values.
            context (google.cloud.functions.Context): The Cloud Functions event
                metadata.
        """
    
        if "data" in event:
            # Triggered via Cloud Scheduler, decode the inner data field of the json payload.
            json_data = json.loads(base64.b64decode(event["data"]).decode("utf-8"))
        else:
            # Otherwise, for instance if triggered via the Cloud Console on a Cloud Function, the event is the data.
            json_data = event
    
        bucket = json_data["bucket"]
        entity_filter = {}
    
        if "kinds" in json_data:
            entity_filter["kinds"] = json_data["kinds"]
    
        if "namespaceIds" in json_data:
            entity_filter["namespaceIds"] = json_data["namespaceIds"]
    
        request_body = {"outputUrlPrefix": bucket, "entityFilter": entity_filter}
    
        export_request = datastore.projects().export(
            projectId=project_id, body=request_body
        )
        response = export_request.execute()
        print(response)
    
  9. Dans requirements.txt, ajoutez la dépendance suivante :
    google-api-python-client==2.22.0
    
  10. Sous Point d'entrée, saisissez datastore_export, le nom de la fonction dans main.py.
  11. Cliquez sur Deploy (Déployer) pour déployer la fonction Cloud.

Configurer les autorisations d'accès

Ensuite, accordez à la fonction Cloud l'autorisation d'exécuter des opérations d'exportation et d'écrire dans votre bucket Cloud Storage.

Cette fonction Cloud utilise le compte de service par défaut de votre projet pour authentifier et autoriser ses opérations d'exportation. Lorsque vous créez un projet, un compte de service par défaut est créé pour vous avec le nom suivant :

project_id@appspot.gserviceaccount.com

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

  • Cloud Datastore Import Export Admin
  • Rôle Owner ou Storage Admin dans le bucket

Vous pouvez utiliser les outils de ligne de commande gcloud et gsutil pour attribuer ces rôles. Vous pouvez accéder à ces outils depuis Cloud Shell dans Google Cloud Console :
Démarrer Cloud Shell

  1. Attribuez le rôle Administrateur des importations et des exportations Cloud Datastore. Remplacez l'élément project_id et exécutez la commande suivante :

    gcloud projects add-iam-policy-binding project_id \
        --member serviceAccount:project_id@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. Attribuez le rôle Administrateur de l'espace de stockage sur votre bucket. Remplacez les éléments project_id et bucket_name, puis exécutez la commande suivante :

    gsutil iam ch serviceAccount:project_id@appspot.gserviceaccount.com:admin \
        gs://bucket_name
    

Créer une tâche Cloud Scheduler

Ensuite, créez une tâche Cloud Scheduler qui appelle la fonction Cloud datastore_export :

  1. Ouvrez la page Cloud Scheduler dans Cloud Console :

    Ouvrir la page Cloud Scheduler

  2. Cliquez sur Créer une tâche.

  3. Saisissez un Nom pour la tâche, par exemple scheduledDatastoreExport.

  4. Saisissez une fréquence au format unix-cron.

  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 à côté de votre fonction Cloud, startDatastoreExport dans l'exemple ci-dessus.

  7. Dans le champ Charge utile, saisissez un objet JSON pour configurer l'opération d'exportation. La fonction Cloud datastore_export nécessite une valeur bucket. Vous pouvez également inclure des valeurs kinds ou namespaceIDs visant à définir un filtre d'entité, par exemple :

    Exporter toutes les entités

    {
    "bucket": "gs://bucket_name"
    }
    

    Exporter des entités filtrées

    • Exporter les entités de genre User ou Task à partir de tous les espaces de noms :

      {
      "bucket": "gs://bucket_name",
      "kinds": ["User", "Task"]
      }
      

    • Exporter les entités de genre User ou Task à partir des espaces de noms par défaut et Testers. Utilisez une chaîne vide ("") pour spécifier l'espace de noms par défaut :

      {
      "bucket": "gs://bucket_name",
      "kinds": ["User", "Task"],
      "namespaceIds": ["", "Testers"]
      }
      

    • Exporter les entités de tout type à partir des espaces de noms par défaut et Testers. Utilisez une chaîne vide ("") pour spécifier l'espace de noms par défaut :

      {
      "bucket": "gs://bucket_name",
      "namespaceIds": ["", "Testers"]
      }
      

    bucket_name est le nom de votre bucket Cloud Storage.

  8. Cliquez sur Créer.

Tester vos exportations planifiées

Pour tester votre fonction Cloud et votre tâche Cloud Scheduler, exécutez cette dernière sur la page Cloud Scheduler de Google Cloud Console. Si l'opération réussit, une opération d'exportation effective est déclenchée.

  1. Ouvrez la page Cloud Scheduler dans Cloud Console.
    Ouvrir la page Cloud Scheduler

  2. Dans la ligne de votre nouvelle tâche Cloud Scheduler, cliquez sur Exécuter.

    Patientez quelques secondes, puis cliquez sur Actualiser. La tâche Cloud Scheduler doit mettre à jour la colonne de résultats vers la mention Opération réussie et la colonne Dernière exécution vers l'heure en cours.

La page Cloud Scheduler confirme uniquement que la tâche a envoyé un message au sujet Pub/Sub. Pour confirmer que votre requête d'exportation a abouti, consultez les journaux de votre fonction Cloud.

Afficher les journaux Cloud Functions

Pour vérifier que la fonction Cloud a bien lancé une opération d'exportation, consultez la page Visionneuse de journaux dans Cloud Console.

Ouvrir la page Visionneuse de journaux

Les journaux de la fonction Cloud signalent les erreurs ainsi que les lancements d'exportation ayant réussi.

Afficher la progression de l'exportation

Vous pouvez utiliser la commande gcloud datastore operations list pour afficher la progression de vos opérations d'exportation. Consultez la section Répertorier toutes les opérations de longue durée.

Une fois l'exportation terminée, vous pouvez afficher les fichiers de sortie dans votre bucket Cloud Storage. Le service d'exportation géré utilise un horodatage pour organiser vos opérations d'exportation :

Ouvrir le navigateur Cloud Storage