Automatisez les sauvegardes pour les instances de base de données Amazon RDS for PostgreSQL à l'aide d'AWS Batch - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Automatisez les sauvegardes pour les instances de base de données Amazon RDS for PostgreSQL à l'aide d'AWS Batch

Créée par Kirankumar Chandrashekar (AWS)

Environnement : PoC ou pilote

Technologies : conteneurs et microservices ; bases de données ; DevOps

Charge de travail : toutes les autres charges de travail

Services AWS : Amazon RDS ; AWS Batch ; Amazon CloudWatch ; AWS Lambda ; Amazon S3

Récapitulatif

La sauvegarde de vos bases de données PostgreSQL est une tâche importante qui peut généralement être effectuée à l'aide de l'utilitaire pg_dump, qui utilise la commande COPY par défaut pour créer un schéma et un vidage des données d'une base de données PostgreSQL. Toutefois, ce processus peut devenir répétitif si vous avez besoin de sauvegardes régulières pour plusieurs bases de données PostgreSQL. Si vos bases de données PostgreSQL sont hébergées dans le cloud, vous pouvez également tirer parti de la fonctionnalité de sauvegarde automatique fournie par Amazon Relational Database Service (Amazon RDS) pour PostgreSQL. Ce modèle décrit comment automatiser les sauvegardes régulières pour les instances de base de données Amazon RDS for PostgreSQL à l'aide de l'utilitaire pg_dump.

Remarque : Les instructions supposent que vous utilisez Amazon RDS. Toutefois, vous pouvez également utiliser cette approche pour les bases de données PostgreSQL hébergées en dehors d'Amazon RDS. Pour effectuer des sauvegardes, la fonction AWS Lambda doit pouvoir accéder à vos bases de données.

Un événement Amazon CloudWatch Events basé sur le temps lance une fonction Lambda qui recherche des balises de sauvegarde spécifiques appliquées aux métadonnées des instances de base de données PostgreSQL sur Amazon RDS. Si les instances de base de données PostgreSQL possèdent la balise bkp:AutomatedDBdump = Active et d'autres balises de sauvegarde requises, la fonction Lambda soumet des tâches individuelles pour chaque sauvegarde de base de données à AWS Batch. 

AWS Batch traite ces tâches et télécharge les données de sauvegarde dans un compartiment Amazon Simple Storage Service (Amazon S3). Ce modèle utilise un fichier Dockerfile et un fichier entrypoint.sh pour créer une image de conteneur Docker qui est utilisée pour effectuer des sauvegardes dans le cadre de la tâche AWS Batch. Une fois le processus de sauvegarde terminé, AWS Batch enregistre les détails de la sauvegarde dans une table d'inventaire sur Amazon DynamoDB. Comme mesure de protection supplémentaire, un événement CloudWatch Events déclenche une notification Amazon Simple Notification Service (Amazon SNS) en cas d'échec d'une tâche dans AWS Batch. 

Conditions préalables et limitations

Prérequis

Architecture

Architecture permettant de sauvegarder les instances de base de données Amazon RDS for PostgreSQL à l'aide de l'utilitaire pg_dump.

Pile technologique

  • CloudWatch Événements Amazon

  • Amazon DynamoDB

  • Amazon Elastic Container Registry (Amazon ECR)

  • Amazon RDS

  • Amazon SNS

  • Amazon S3

  • AWS Batch

  • AWS Key Management Service (AWS KMS)

  • AWS Lambda

  • AWS Secrets Manager

  • Docker

Outils

  • Amazon CloudWatch Events — CloudWatch Events fournit un flux en temps quasi réel d'événements système décrivant les modifications apportées aux ressources AWS.

  • Amazon DynamoDB — DynamoDB est un service de base de données NoSQL entièrement géré qui fournit des performances rapides et prévisibles ainsi qu'une évolutivité sans faille.

  • Amazon ECR — Amazon Elastic Container Registry (Amazon ECR) est un service de registre d'images de conteneurs AWS géré qui est sécurisé, évolutif et fiable.

  • Amazon RDS — Amazon Relational Database Service (Amazon RDS) est un service Web qui facilite la configuration, l'exploitation et le dimensionnement d'une base de données relationnelle dans le cloud AWS.

  • Amazon SNS — Amazon Simple Notification Service (Amazon SNS) est un service géré qui fournit des messages aux abonnés par les éditeurs.

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) est un service de stockage pour Internet.

  • AWS Batch — AWS Batch vous aide à exécuter des charges de travail de calcul par lots sur le cloud AWS.

  • AWS KMS — AWS Key Management Service (AWS KMS) est un service géré qui vous permet de créer et de contrôler facilement les clés de chiffrement utilisées pour chiffrer vos données.

  • AWS Lambda — Lambda est un service de calcul qui vous permet d'exécuter du code sans provisionner ni gérer de serveurs.

  • AWS Secrets Manager — Secrets Manager vous aide à remplacer les informations d'identification codées en dur dans votre code, y compris les mots de passe, par un appel d'API à Secrets Manager pour récupérer le secret par programmation.

  • Docker — Docker aide les développeurs à emballer, expédier et exécuter facilement n'importe quelle application sous la forme d'un conteneur léger, portable et autonome.

Vos instances de base de données PostgreSQL sur Amazon RDS doivent avoir des balises appliquées à leurs métadonnées. La fonction Lambda recherche des balises pour identifier les instances de base de données qui doivent être sauvegardées. Les balises suivantes sont généralement utilisées.

Balise

Description

bkp:AutomatedDBDump = Actif

Identifie une instance de base de données Amazon RDS comme candidate aux sauvegardes.

point de vente : = AutomatedBackupSecret <secret_name >

Identifie le secret Secrets Manager qui contient les identifiants de connexion Amazon RDS.

BKP:AutomatedDBDumps3bucket = <s3_bucket_name>

Identifie le compartiment S3 auquel envoyer les sauvegardes.

BKP : base de données automatisée DumpFrequency

BKP : base de données automatisée DumpTime

Identifiez la fréquence et les heures auxquelles les bases de données doivent être sauvegardées. 

bkp : pgdumpcommand = <pgdump_command>

Identifie les bases de données pour lesquelles les sauvegardes doivent être effectuées.

Épopées

TâcheDescriptionCompétences requises

Créez une table dans DynamoDB.

Connectez-vous à la console de gestion AWS, ouvrez la console Amazon DynamoDB et créez une table. Pour obtenir de l'aide sur ce sujet et sur d'autres articles, consultez la section Ressources connexes.

Administrateur cloud, administrateur de base de données

Vérifiez que la table a été créée.

Exécutez la commande aws dynamodb describe-table --table-name <table-name> | grep TableStatus. Si la table existe, la commande renvoie le "TableStatus": "ACTIVE", résultat.

Administrateur cloud, administrateur de base de données
TâcheDescriptionCompétences requises

Créez une rubrique SNS.

Ouvrez la console Amazon SNS, choisissez Rubriques et créez une rubrique SNS portant ce nom. JobFailedAlert Inscrivez une adresse e-mail active au sujet et consultez votre boîte de réception pour confirmer l'e-mail d'abonnement au réseau social envoyé par AWS Notifications.

Administrateur du cloud

Créez une règle d'échec de tâche pour AWS Batch.

Ouvrez la CloudWatch console Amazon, choisissez Events, puis Create rule. Choisissez Afficher les options avancées, puis Modifier. Pour créer un modèle qui sélectionne les événements à traiter par vos cibles, remplacez le texte existant par le code « Échec de la tâche » figurant dans la section Informations supplémentaires. Ce code définit une règle d' CloudWatch événements qui démarre lorsqu'AWS Batch a un Failed événement.

Administrateur du cloud

Ajoutez une cible de règle d'événement.

Dans Cibles, choisissez Ajouter des cibles, puis sélectionnez la rubrique JobFailedAlert SNS. Configurez les autres détails et créez la règle Cloudwatch Events.

Administrateur du cloud
TâcheDescriptionCompétences requises

Créez un référentiel Amazon ECR.

Ouvrez la console Amazon ECR et choisissez la région AWS dans laquelle vous souhaitez créer votre référentiel. Choisissez Référentiels, puis sélectionnez Créer un référentiel. Configurez le référentiel en fonction de vos besoins.

Administrateur du cloud

Écrivez un fichier Dockerfile.

Connectez-vous à Docker et utilisez les « Exemple de fichier Dockerfile » et « Exemple de fichier entrypoint.sh » de la section Informations supplémentaires pour créer un Dockerfile.

DevOps ingénieur

Créez une image Docker et envoyez-la vers le référentiel Amazon ECR.

Créez le Dockerfile en une image Docker et transférez-le vers le référentiel Amazon ECR. Pour obtenir de l'aide concernant cette histoire, consultez la section Ressources connexes.

DevOps ingénieur
TâcheDescriptionCompétences requises

Créez une définition de tâche AWS Batch.

Ouvrez la console AWS Batch et créez une définition de tâche qui inclut l'identifiant de ressource uniforme (URI) du référentiel Amazon ECR comme propriétéImage.

Administrateur du cloud

Configurez la file d'attente des tâches AWS Batch.

Sur la console AWS Batch, choisissez Job queues, puis Create queue. Créez une file d'attente qui stockera les tâches jusqu'à ce qu'AWS Batch les exécute sur les ressources de votre environnement informatique. Important : assurez-vous d'écrire une logique pour qu'AWS Batch enregistre les détails de la sauvegarde dans la table d'inventaire DynamoDB.

Administrateur du cloud
TâcheDescriptionCompétences requises

Créez une fonction Lambda pour rechercher des balises.

Créez une fonction Lambda qui recherche des balises sur vos instances de base de données PostgreSQL et identifie les candidats de sauvegarde. Assurez-vous que votre fonction Lambda peut identifier la bkp:AutomatedDBDump = Active balise et toutes les autres balises requises. Important : La fonction Lambda doit également être capable d'ajouter des tâches à la file d'attente des tâches AWS Batch.

DevOps ingénieur

Créez un CloudWatch événement basé sur le temps.

Ouvrez la CloudWatch console Amazon et créez un événement CloudWatch Events qui utilise une expression cron pour exécuter votre fonction Lambda selon un calendrier régulier. Important : Tous les événements planifiés utilisent le fuseau horaire UTC.

Administrateur du cloud
TâcheDescriptionCompétences requises

Créez une clé Amazon KMS.

Ouvrez la console Amazon KMS et créez une clé KMS qui peut être utilisée pour chiffrer les informations d'identification Amazon RDS stockées dans AWS Secrets Manager.

Administrateur du cloud

Créez un secret AWS Secrets Manager.

Ouvrez la console AWS Secrets Manager et stockez vos informations d'identification de base de données Amazon RDS for PostgreSQL en tant que secret.

Administrateur du cloud

Ajoutez les balises requises aux instances de base de données PostgreSQL.

Ouvrez la console Amazon RDS et ajoutez des balises aux instances de base de données PostgreSQL que vous souhaitez sauvegarder automatiquement. Vous pouvez utiliser les balises figurant dans le tableau de la section Outils. Si vous avez besoin de sauvegardes à partir de plusieurs bases de données PostgreSQL au sein de la même instance Amazon RDS, -d test:-d test1 utilisez-la comme valeur pour la balise. bkp:pgdumpcommand Important : test et ce test1 sont des noms de bases de données. Assurez-vous qu'il n'y a pas d'espace après les deux points (:).

Administrateur du cloud

Vérifiez l'automatisation des sauvegardes.

Pour vérifier l'automatisation des sauvegardes, vous pouvez soit appeler la fonction Lambda, soit attendre que le planning de sauvegarde commence. Une fois le processus de sauvegarde terminé, vérifiez que la table d'inventaire DynamoDB contient une entrée de sauvegarde valide pour vos instances de base de données PostgreSQL. S'ils correspondent, le processus d'automatisation des sauvegardes est réussi.

Administrateur du cloud

Ressources connexes

Création d'une table d'inventaire dans DynamoDB

 

Création d'une rubrique SNS pour les échecs de tâches dans AWS Batch

 

Créez une image Docker et envoyez-la vers un référentiel Amazon ECR

 

Création des composants AWS Batch

 

Création d'une fonction Lambda

 

Création d'un CloudWatch événement

 

Testez l'automatisation des sauvegardes

Informations supplémentaires

Événement d'échec de la tâche :

{ "detail-type": [ "Batch Job State Change" ], "source": [ "aws.batch" ], "detail": { "status": [ "FAILED" ] } }

Exemple de fichier Docker :

FROM alpine:latest RUN apk --update add py-pip postgresql-client jq bash && \ pip install awscli && \ rm -rf /var/cache/apk/* ADD entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"]

Exemple de fichier entrypoint.sh :

#!/bin/bash set -e DATETIME=`date +"%Y-%m-%d_%H_%M"` FILENAME=RDS_PostGres_dump_${RDS_INSTANCE_NAME} FILE=${FILENAME}_${DATETIME} aws configure --profile new-profile set role_arn arn:aws:iam::${TargetAccountId}:role/${TargetAccountRoleName} aws configure --profile new-profile set credential_source EcsContainer echo "Central Account access provider IAM role is: " aws sts get-caller-identity echo "Target Customer Account access provider IAM role is: " aws sts get-caller-identity --profile new-profile securestring=$(aws secretsmanager get-secret-value --secret-id $SECRETID --output json --query 'SecretString' --region=$REGION --profile new-profile) if [[ ${securestring} ]]; then echo "successfully accessed secrets manager and got the credentials" export PGPASSWORD=$(echo $securestring | jq --raw-output | jq -r '.DB_PASSWORD') PGSQL_USER=$(echo $securestring | jq --raw-output | jq -r '.DB_USERNAME') echo "Executing pg_dump for the PostGres endpoint ${PGSQL_HOST}" # pg_dump -h $PGSQL_HOST -U $PGSQL_USER -n dms_sample | gzip -9 -c | aws s3 cp - --region=$REGION --profile new-profile s3://$BUCKET/$FILE # in="-n public:-n private" IFS=':' list=($EXECUTE_COMMAND); for command in "${list[@]}"; do echo $command; pg_dump -h $PGSQL_HOST -U $PGSQL_USER ${command} | gzip -9 -c | aws s3 cp - --region=$REGION --profile new-profile s3://${BUCKET}/${FILE}-${command}".sql.gz" echo $?; if [[ $? -ne 0 ]]; then echo "Error occurred in database backup process. Exiting now....." exit 1 else echo "Postgresql dump was successfully taken for the RDS endpoint ${PGSQL_HOST} and is uploaded to the following S3 location s3://${BUCKET}/${FILE}-${command}.sql.gz" #write the details into the inventory table in central account echo "Writing to DynamoDB inventory table" aws dynamodb put-item --table-name ${RDS_POSTGRES_DUMP_INVENTORY_TABLE} --region=$REGION --item '{ "accountId": { "S": "'"${TargetAccountId}"'" }, "dumpFileUrl": {"S": "'"s3://${BUCKET}/${FILE}-${command}.sql.gz"'" }, "DumpAvailableTime": {"S": "'"`date +"%Y-%m-%d::%H::%M::%S"` UTC"'"}}' echo $? if [[ $? -ne 0 ]]; then echo "Error occurred while putting item to DynamoDb Inventory Table. Exiting now....." exit 1 else echo "Successfully written to DynamoDb Inventory Table ${RDS_POSTGRES_DUMP_INVENTORY_TABLE}" fi fi done; else echo "Something went wrong {$?}" exit 1 fi exec "$@"