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.
Objectifs
- Créer un bucket Cloud Storage et une instance Memorystore
- Créer un sujet Pub/Sub, une fonction Cloud et une tâche Cloud Scheduler
- Déclencher l'exportation des données d'une base de données en exécutant la tâche Cloud Scheduler manuellement
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.
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
-
Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.
-
Vérifiez que la facturation est activée pour votre projet Google Cloud.
-
Dans la console Google Cloud, activez Cloud Shell.
-
Activer les API Memorystore for Redis, Cloud Functions, Cloud Scheduler, and Cloud Build.
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.
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"
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.
Créer une instance Memorystore pour Redis :
gcloud redis instances create ${MEM_INSTANCE} --size=1 --region=${REGION}
Cette opération prend quelques minutes.
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
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.
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)")
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}"
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.
Créez un dossier pour le code de la fonction Cloud :
mkdir scheduler_gcf_code && cd scheduler_gcf_code
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
Créez un fichier
requirements.txt
en collant le contenu suivant dans Cloud Shell :cat <<EOF > requirements.txt google-api-python-client Oauth2client EOF
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.
Enregistrez le nom complet de Memorystore dans une variable :
export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
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.
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}
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
estTrue
pour indiquer qu'elle est terminée. Si l'étatDONE
afficheFalse
, 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
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.
- Dans la console Google Cloud, accédez à la page Gérer les ressources.
- Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
- Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.
Étape suivante
- Apprenez à planifier des instances de calcul avec Cloud Scheduler.
- Découvrez comment planifier les exportations de la base de données Cloud SQL à l'aide de Cloud Scheduler.
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.