Planifier des sauvegardes de base de données Cloud SQL

Planifier des sauvegardes de base de données Cloud SQL

Ce tutoriel explique comment utiliser Cloud Scheduler et les fonctions Cloud Run pour planifier des sauvegardes manuelles pour une base de données Cloud SQL.

Ce tutoriel prend environ 30 minutes.

Tout d'abord, configurez l'environnement en clonant un dépôt Git contenant les bases de données de test et en stockant ces dernières dans un bucket Cloud Storage.

Ensuite, créez une instance de base de données Cloud SQL pour MySQL et importez les bases de données de test à partir du bucket Cloud Storage dans l'instance.

Une fois l'environnement configuré, créez une tâche Cloud Scheduler qui publie un message de déclenchement de sauvegarde à une date et une heure planifiées sur un sujet Pub/Sub. Le message contient des informations sur le nom de l'instance Cloud SQL et sur l'ID du projet. Le message déclenche une fonction Cloud Run. La fonction utilise l'API Cloud SQL Admin pour démarrer une sauvegarde de base de données sur Cloud SQL. Le schéma suivant illustre ce workflow :

Workflow depuis Cloud Scheduler vers Pub/Sub pour déclencher une fonction Cloud Run qui démarre la sauvegarde.

Composants Google Cloud

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.

  • Cloud Storage : stocke les bases de données de test que vous importez dans Cloud SQL.
  • Instance Cloud SQL : contient la base de données à sauvegarder.
  • Cloud Scheduler : publie des messages dans un sujet Pub/Sub selon un calendrier défini.
  • Pub/Sub : contient les messages envoyés depuis Cloud Scheduler.
  • Fonctions Cloud Run : s'abonne au sujet Pub/Sub et, lorsque déclenchées, effectuent un appel d'API vers l'instance Cloud SQL pour lancer la sauvegarde.

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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Dans la console Google Cloud, accédez à la page API et activez les API suivantes :

    • API Cloud SQL Admin
    • API Cloud Run functions
    • API Cloud Scheduler
    • API Cloud Build
    • API App Engine Admin

    Accéder aux API

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

Configurer votre environnement

Pour commencer, vous devez d'abord cloner le dépôt contenant les exemples de données. Vous devez ensuite configurer votre environnement et créer des rôles personnalisés disposant des autorisations nécessaires pour ce tutoriel.

Vous pouvez effectuer toutes les tâches de ce tutoriel dans Cloud Shell.

  1. Clonez le dépôt contenant les exemples de données :

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
    

    Vous devez créer une base de données avec des enregistrements fictifs à l'aide des données du dépôt training-data-analyst.

  2. Configurez les variables d'environnement suivantes :

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="sql-backup-tutorial"
    export BUCKET_NAME=${USER}-MySQL-$(date +%s)
    export SQL_INSTANCE="${DEMO}-sql"
    export GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export SQL_ROLE="sqlBackupCreator"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-west2"
    
  3. 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.objects.get"
    
    gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \
        --title "SQL Backup role" \
        --description "Grant permissions to backup data from a Cloud SQL instance" \
        --permissions "cloudsql.backupRuns.create"
    

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

Créer une instance Cloud SQL

Dans cette section, vous allez créer un bucket Cloud Storage et une instance Cloud SQL pour MySQL. Vous transférerez ensuite la base de données de test dans le bucket Cloud Storage et l'importerez dans l'instance Cloud SQL.

Créer un bucket Cloud Storage

Vous utilisez gcloud CLI pour créer un bucket Cloud Storage.

```sh
gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}
```

Créer une instance Cloud SQL et octroyer des autorisations à son compte de service

Créez ensuite une instance Cloud SQL et attribuez à son compte de service les autorisations nécessaires pour créer des exécutions de sauvegarde.

  1. Créez une instance Cloud SQL pour MySQL :

    sh gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --region ${REGION}

    Cette opération prend quelques minutes.

  2. Vérifiez que l'instance Cloud SQL est en cours d'exécution :

    gcloud sql instances list --filter name=${SQL_INSTANCE}
    

    La sortie ressemble à ceci :

    NAME                     DATABASE_VERSION  LOCATION    TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    sql-backup-tutorial      MYSQL_5_7         us-west2-b  db-n1-standard-1  x.x.x.x     -                RUNNABLE
    

  3. Accordez à votre compte de service Cloud SQL les autorisations nécessaires pour exporter des données vers Cloud Storage avec le rôle Simple Storage :

    export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
        --project ${PROJECT_ID} \
        --format "value(serviceAccountEmailAddress)"`)
    
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
        --member=serviceAccount:${SQL_SA} \
        --role=projects/${PROJECT_ID}/roles/${STORAGE_ROLE}
    

Remplir une instance Cloud SQL avec des exemples de données

Vous pouvez à présent importer des fichiers dans votre bucket, puis créer votre exemple de base de données et le remplir.

  1. Accédez au dépôt que vous avez cloné :

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Importez les fichiers du répertoire dans votre nouveau bucket :

    gcloud storage cp * gs://${BUCKET_NAME}
    
  3. Créer un exemple de base de données. À la question "Do you want to continue (Y/n)?" (Voulez-vous continuer (O/N) ?), saisissez "Y" (Oui) pour continuer.

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
  4. Remplissez la base de données. À la question "Do you want to continue (Y/n)?" (Voulez-vous continuer (O/N) ?), saisissez "Y" (Oui) pour continuer.

    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \
        --database recommendation_spark \
        --table Accommodation
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \
        --database recommendation_spark \
        --table Rating
    

Créer un sujet, une fonction et une tâche Cloud Scheduler

Dans cette section, vous allez créer un compte de service IAM personnalisé et le lier au rôle SQL personnalisé que vous avez créé dans la section Configurer votre environnement. Vous allez ensuite créer un sujet Pub/Sub et une fonction Cloud Run qui s'abonne au sujet puis utilise l'API Cloud SQL Admin pour lancer une sauvegarde. Enfin, vous allez créer une tâche Cloud Scheduler pour publier régulièrement un message dans le sujet Pub/Sub.

Créer un compte de service pour la fonction Cloud Run

La première étape consiste à créer un compte de service personnalisé et à le lier au rôle SQL personnalisé que vous avez créé dans la section Configurer votre environnement.

  1. Créez un compte de service IAM à utiliser par la fonction Cloud Run :

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Accordez au compte de service de la fonction Cloud Run l'accès au rôle SQL personnalisé :

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
    

Créer un sujet Pub/Sub

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

```sh
gcloud pubsub topics create ${PUBSUB_TOPIC}
```

Créer une fonction Cloud Run

Créez à présent la fonction Cloud Run.

  1. 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('sqladmin', 'v1beta4', http=credentials.authorize(Http()), cache_discovery=False)
    
        try:
          request = service.backupRuns().insert(
                project=pubsub_message['project'],
                instance=pubsub_message['instance']
            )
          response = request.execute()
        except HttpError as err:
            logging.error("Could NOT run backup. Reason: {}".format(err))
        else:
          logging.info("Backup task status: {}".format(response))
    EOF
    
  2. Créez un fichier requirements.txt en collant le contenu suivant dans Cloud Shell :

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

    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, créez une tâche Cloud Scheduler pour déclencher périodiquement la fonction de sauvegarde de données. Cloud Scheduler utilise une instance App Engine pour le déploiement.

  1. Créez une instance App Engine pour la tâche Cloud Scheduler :

    gcloud app create --region=${REGION}
    
  2. Créez une tâche Cloud Scheduler :

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \
    --schedule "0 * * * *" \
    --topic ${PUBSUB_TOPIC} \
    --message-body '{"instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"'}' \
    --time-zone 'America/Los_Angeles'
    

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 afin de déclencher un vidage MySQL de votre base de données.

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

    gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
    

    Le résultat affiche une tâche de sauvegarde terminée. Par exemple :

    NAME                                  TYPE           START                          END                            ERROR  STATUS
    8b031f0b-9d66-47fc-ba21-67dc20193749  BACKUP_VOLUME  2020-02-06T21:55:22.240+00:00  2020-02-06T21:55:32.614+00:00  -      DONE
    

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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Si vous ne souhaitez pas supprimer l'intégralité du projet, supprimez chacune des ressources que vous avez créées. Pour ce faire, accédez aux pages correspondantes dans la console Google Cloud, sélectionnez la ressource, puis supprimez-la.

Étape suivante