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

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

Ce tutoriel utilise 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é ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

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. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  3. Dans Cloud Console, activez Cloud Shell.

    Activer Cloud Shell

  4. Activer les API Memorystore pour Redis, Cloud Functions, Cloud Scheduler et App Engine .

    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 GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export MEM_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_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 Simple Storage :

    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 un sujet Pub/Sub, une fonction Cloud et une tâche Cloud Scheduler

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 personnalisé et à le lier au rôle Redis personnalisé que vous créez.

  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 ${GCF_NAME} \
        --display-name="Service Account for GCF and Memorystore"
    
    export GCF_SA=$(gcloud iam service-accounts list --filter="${GCF_NAME}" --format="value(email)")
    
  2. Accordez au compte de service Cloud Functions l'accès au rôle Redis personnalisé :

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_SA}" \
        --role="projects/${PROJECT_ID}/roles/${MEM_ROLE}"
    
  3. Accordez au compte de service de fonction Cloud Functions l'accès au rôle de stockage 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
        uri = f"{pubsub_message['gs']}/backup-{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. Lorsque vous êtes invité à autoriser les appels non authentifiés de la nouvelle fonction, répondez no.

    gcloud functions deploy ${GCF_NAME} \
        --trigger-topic=${PUBSUB_TOPIC} \
        --runtime=python37 \
        --entry-point=main \
        --service-account=${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    

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. Créez une instance App Engine pour la tâche Cloud Scheduler :

    gcloud app create --region=${REGION::-1}
    
  2. Enregistrez le nom complet de Memorystore dans une variable :

    export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
    
  3. 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'
    

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

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}
    
  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}"
    

    Le résultat affiche une tâche d'exportation terminée, par exemple :

    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 gs://${BUCKET_NAME} | grep rdb
    

    Un fichier nommé backup-mem-timestamp.rdb s'affiche après l'opération STATUS de l'étape précédente qui renvoie le message DONE.

Nettoyer

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 Cloud Console, 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