Planifier des exportations de base de données Memorystore pour Redis à l'aide de Cloud Scheduler

Last reviewed 2023-03-18 UTC

Ce tutoriel explique comment utiliser Cloud Scheduler et Cloud Functions pour exporter automatiquement une base de données Memorystore pour Redis vers Cloud Storage. . L'exportation de bases de données sur Cloud Storage vous permet de créer un plan de reprise après sinistre fiable et diversifié. Par exemple, vous pouvez exporter vers une région différente et importer dans d'autres instances Memorystore pour Redis.

Architecture

Ce tutoriel inclut les composants Google Cloud suivants :

  • Tâches Cloud Scheduler : tâches permettant d'appeler les fonctions de démarrage de l'exportation de base de données selon le calendrier défini.
  • Cloud Functions : fonctions permettant d'exporter les données depuis Memorystore vers Cloud Storage.
  • Messages Pub/Sub : messages envoyés et reçus pour chaque événement d'exportation de données.
  • Buckets Cloud Storage : bucket destiné au stockage des données exportées.
  • Memorystore pour Redis : base de données source à partir de laquelle exporter les données.

Une tâche Cloud Scheduler publie un message sur un sujet Pub/Sub contenant des informations sur l'ID d'instance Memorystore, l'ID du projet, la région dans laquelle il se trouve et l'emplacement Cloud Storage dans lequel stocker le sauvegarde. Cet événement déclenche une fonction Cloud qui obtient cette charge utile et lance une exportation de base de données sur Memorystore pour Redis via son API. La base de données génère ensuite l'exportation et l'enregistre dans Cloud Storage. Le schéma suivant illustre ce workflow.

Workflow depuis Cloud Scheduler vers Pub/Sub pour déclencher une fonction Cloud qui démarre l'exportation.

Objectifs

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

  4. Activer les API Memorystore for Redis, Cloud Functions, Cloud Scheduler, and Cloud Build.

    Activer les API

Dans ce tutoriel, vous allez exécuter toutes les commandes à partir de Cloud Shell.

Configurer votre environnement

Pour commencer, configurez d'abord votre environnement, puis créez des rôles personnalisés disposant des autorisations nécessaires pour ce tutoriel.

  1. Dans Cloud Shell, configurez les variables d'environnement suivantes :

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="mem-exporter"
    export BUCKET_NAME=${USER}-mem-$(date +%s)
    export MEM_INSTANCE="${DEMO}-instance"
    export FUNCTION_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export MEM_EXPORT_ROLE="memExporter"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-central1"
    
  2. Créez deux rôles personnalisés qui ne disposent que des autorisations nécessaires pour ce tutoriel :

    gcloud iam roles create ${STORAGE_ROLE} --project=${PROJECT_ID} \
        --title="Simple Storage Role" \
        --description="Grant permissions to view and create objects in Cloud Storage" \
        --permissions="storage.objects.create,storage.buckets.get"
    
    gcloud iam roles create ${MEM_EXPORT_ROLE} --project=${PROJECT_ID} \
        --title="Memorystore Exporter Role" \
        --description="Grant permissions to export data from a Memorystore instance to a Cloud Storage bucket" \
        --permissions="redis.instances.export"
    

    Ces rôles réduisent le champ d'application des accès aux comptes de service Cloud Functions et Memorystore, conformément au principe du moindre privilège.

Créer un bucket Cloud Storage et une instance Memorystore

Dans cette section, vous devez d'abord créer un bucket Cloud Storage et une instance Memorystore for Redis. Remplissez ensuite le Memorystore avec des exemples de données.

Créer un bucket Cloud Storage

Vous créez un bucket Cloud Storage à l'aide de l'outil de ligne de commande gsutil.

  • Créez le bucket Cloud Storage dans lequel vous souhaitez enregistrer les exportations de données :

    gsutil mb -l ${REGION} gs://${BUCKET_NAME}
    

Créer une instance Memorystore et accorder des autorisations à son compte de service

Créez ensuite une instance Memorystore et accordez à son compte de service les autorisations nécessaires pour exporter des données vers Cloud Storage.

  1. Créer une instance Memorystore pour Redis :

    gcloud redis instances create ${MEM_INSTANCE} --size=1 --region=${REGION}
    

    Cette opération prend quelques minutes.

  2. Vérifiez que l'instance Memorystore est READY :

    gcloud redis instances list --region=${REGION}
    

    La sortie ressemble à ceci :

    INSTANCE_NAME   VERSION    REGION       TIER   SIZE_GB  HOST          PORT  NETWORK  RESERVED_IP      STATUS  CREATE_TIME
    redis-instance  REDIS_4_0  us-central1  BASIC  1        10.61.20.131  6379  default  10.61.20.128/29  READY   2020-04-23T18:38:54
    
  3. Accordez à votre compte de service Memorystore les autorisations nécessaires pour exporter des données vers Cloud Storage avec le rôle personnalisé Simple Storage que vous avez créé précédemment:

    export MEM_SA=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} \
        --project ${PROJECT_ID} \
        --format "value(persistenceIamIdentity)")
    
    gsutil iam ch ${MEM_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

Créer la tâche d'exportation de données planifiée

Dans cette section, vous allez créer un compte de service personnalisé et le lier au rôle Redis personnalisé que vous créez. Vous allez ensuite créer un sujet Pub/Sub permettant de déclencher l'exécution d'une fonction Cloud. Vous allez également créer une tâche Cloud Scheduler pour exécuter régulièrement la fonction d'exportation de données.

Créer un compte de service pour la fonction Cloud

La première étape consiste à créer un compte de service et à le lier aux rôles.

  1. Créez un compte de service IAM pour que la fonction Cloud l'utilise et enregistrez-la dans la variable :

    gcloud iam service-accounts create ${FUNCTION_NAME} \
        --display-name="Service Account for GCF and Memorystore"
    
    export GCF_SA=$(gcloud iam service-accounts list --filter="${FUNCTION_NAME}" --format="value(email)")
    
  2. Accordez au compte de service l'accès au rôle Memorystore Exporter personnalisé qui lui permet de demander des exportations Memorystore:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_SA}" \
        --role="projects/${PROJECT_ID}/roles/${MEM_EXPORT_ROLE}"
    
  3. Accordez au compte de service l'accès au rôle Simple Storage personnalisé.

    gsutil iam ch \
        serviceAccount:${GCF_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} \
        gs://${BUCKET_NAME}
    

Créer un sujet Pub/Sub

L'étape suivante consiste à créer un sujet Pub/Sub permettant de déclencher la fonction Cloud qui interagit avec la base de données Memorystore.

  • Créez le sujet Pub/Sub :

    gcloud pubsub topics create ${PUBSUB_TOPIC}
    

Créer une fonction Cloud

Créez à présent la fonction Cloud.

  1. Créez un dossier pour le code de la fonction Cloud :

    mkdir scheduler_gcf_code && cd scheduler_gcf_code
    
  2. Créez un fichier main.py en collant le contenu suivant dans Cloud Shell :

    cat <<EOF  > main.py
    
    import base64
    import logging
    import json
    
    from datetime import datetime
    from httplib2 import Http
    
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    from oauth2client.client import GoogleCredentials
    
    def main(event, context):
        pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8'))
        credentials = GoogleCredentials.get_application_default()
    
        service = discovery.build('redis', 'v1beta1', http=credentials.authorize(Http()), cache_discovery=False)
    
        datestamp = datetime.now().strftime("%Y%m%d%H%M") # format timestamp: YearMonthDayHourMinute
        instance_name=pubsub_message['name'].split("/")[-1]
        uri = f"{pubsub_message['gs']}/backup-{instance_name}-{datestamp}.rdb"
    
        request_body = {
            "outputConfig": {
                "gcsDestination" : {
                    "uri": uri
                }
            }
        }
    
        try:
            request = service.projects().locations().instances().export(
                name=pubsub_message['name'],
                body=request_body
            )
    
            response = request.execute()
        except HttpError as err:
            logging.error(f"Could NOT run backup. Reason: {err}")
        else:
            logging.info(f"Backup task status: {response}")
    EOF
    
  3. Créez un fichier requirements.txt en collant le contenu suivant dans Cloud Shell :

    cat <<EOF > requirements.txt
    
    google-api-python-client
    Oauth2client
    EOF
    
  4. Déployez le code.

    gcloud functions deploy ${FUNCTION_NAME} \
        --trigger-topic=${PUBSUB_TOPIC} \
        --runtime=python37 \
        --entry-point=main \
        --service-account=${FUNCTION_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
        --ingress-settings=internal-and-gclb
    

Créer une tâche Cloud Scheduler

Enfin, vous allez créer une tâche Cloud Scheduler pour exécuter régulièrement la fonction d'exportation de données.

  1. Enregistrez le nom complet de Memorystore dans une variable :

    export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
    
  2. Créez une tâche Cloud Scheduler permettant d'exécuter régulièrement la fonction d'exportation de données :

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \
        --schedule='0 23 * * *' --topic=${PUBSUB_TOPIC} \
        --message-body='{"name":'\"${MEM_NAME}\"',"gs":'\"gs://${BUCKET_NAME}\"'}' \
        --time-zone='America/Los_Angeles' --location=${REGION}
    

    Cette tâche est programmée pour s'exécuter tous les jours à 23 heures (heure du Pacifique).

    Le corps du message contient le nom de l'instance Memorystore à exporter, ainsi que le bucket Cloud Storage de destination.

Tester votre solution

La dernière étape consiste à tester votre solution. Commencez par exécuter la tâche Cloud Scheduler.

  1. Exécutez la tâche Cloud Scheduler manuellement pour déclencher une exportation Memorystore de votre base de données.

    gcloud scheduler jobs run ${SCHEDULER_JOB} --location=${REGION}
    
  2. Répertoriez les opérations effectuées sur l'instance Memorystore et vérifiez s'il existe une opération de type EXPORT :

    gcloud redis operations list --region=${REGION} --filter="${MEM_INSTANCE}"
    

    L'exemple de résultat suivant montre une tâche d'exportation dont l'état DONE est True pour indiquer qu'elle est terminée. Si l'état DONE affiche False, cela signifie que la tâche est toujours en cours de traitement. Patientez une minute, puis exécutez à nouveau la commande précédente.

    OPERATION_NAME                                           REGION       TYPE    TARGET                 DONE  CREATE_TIME          DURATION
    operation-1592329364987-5a837122a600c-b22c2703-5077c6b7  us-central1  export  mem-exporter-instance  True  2020-06-16T17:42:45  16S
    
  3. Vérifiez le bucket Cloud Storage pour voir si le fichier d'exportation a été créé :

    gsutil ls -l gs://${BUCKET_NAME}/*.rdb
    

    Un fichier nommé backup-INSTANCE_NAME-TIMESTAMP.rdb s'affiche.

Effectuer un nettoyage

Afin d'éviter que des frais ne soient facturés sur votre compte Google Cloud pour les ressources utilisées dans ce tutoriel, supprimez le projet que vous venez de créer. Il s'agit du moyen le plus simple d'empêcher la facturation.

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étape suivante