

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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch"></a>

*Kirankumar Chandrashekar, Amazon Web Services*

## Résumé
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-summary"></a>

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\$1dump, qui utilise la](https://www.postgresql.org/docs/current/app-pgdump.html) 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](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html) 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\$1dump.

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](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) données PostgreSQL sur Amazon RDS. Si les instances de base de données PostgreSQL possèdent **la balise DBDump bkp:Automated =** 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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-prereqs"></a>

**Conditions préalables**
+ Un compte AWS actif.
+ Un environnement informatique géré ou non géré existant. Pour plus d'informations, consultez la section [Environnements de calcul gérés et non gérés](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) dans la documentation AWS Batch. 
+ [Image Docker de l'interface de ligne de commande (CLI) AWS version 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html), installée et configurée.
+ Instances de base de données Amazon RDS for PostgreSQL existantes.  
+ Un compartiment S3 existant. 
+ [Docker](https://www.docker.com/), installé et configuré sous Linux, macOS ou Windows.
+ Connaissance du codage dans Lambda. 

## Architecture
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-architecture"></a>

![\[Architecture permettant de sauvegarder les instances de base de données Amazon RDS for PostgreSQL à l'aide de l'utilitaire pg_dump.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/3283f739-980b-43d4-aca0-9d77a2ce3b85/images/352e2eab-1b7d-44ec-840a-a772a175e873.png)


 

**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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-tools"></a>
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) — 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](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) — 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](https://docs.aws.amazon.com/ecr/index.html) — 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](https://docs.aws.amazon.com/rds/index.html) — 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 —](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) Amazon Simple Notification Service (Amazon SNS) est un service géré qui fournit des messages aux abonnés par les éditeurs.
+ [Amazon S3](https://docs.aws.amazon.com/s3/index.html) — Amazon Simple Storage Service (Amazon S3) est un service de stockage pour Internet.
+ [AWS Batch](https://docs.aws.amazon.com/batch/index.html) — AWS Batch vous aide à exécuter des charges de travail de calcul par lots sur le cloud AWS.
+ [AWS KMS](https://docs.aws.amazon.com/kms/index.html) — 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 —](https://docs.aws.amazon.com/lambda/index.html) Lambda est un service de calcul qui vous permet d'exécuter du code sans provisionner ni gérer de serveurs.
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/index.html) — 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](https://www.docker.com/) — 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](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) 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:Automatisé = Actif DBDump  | Identifie une instance de base de données Amazon RDS comme candidate aux sauvegardes. | 
| point de vente : = AutomatedBackupSecret <secret\$1name > | Identifie le secret Secrets Manager qui contient les identifiants de connexion Amazon RDS. | 
| BKP : S3Bucket automatisé = DBDump <s3\$1bucket\$1name> | Identifie le compartiment S3 auquel envoyer les sauvegardes. | 
| BKP DBDump : Fréquence automatiséeBKP DBDump : heure automatisée | Identifiez la fréquence et les heures auxquelles les bases de données doivent être sauvegardées.  | 
| bkp : pgdumpcommand = <pgdump\$1command> | Identifie les bases de données pour lesquelles les sauvegardes doivent être effectuées. | 

## Épopées
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-epics"></a>

### Création d'une table d'inventaire dans DynamoDB
<a name="create-an-inventory-table-in-dynamodb"></a>


| Sous-tâche | Description | Compé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 | 

### Création d'une rubrique SNS pour les échecs de tâches dans AWS Batch
<a name="create-an-sns-topic-for-failed-job-events-in-aws-batch"></a>


| Sous-tâche | Description | Compé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 | 

### Créez une image Docker et envoyez-la vers un référentiel Amazon ECR
<a name="build-a-docker-image-and-push-it-to-an-amazon-ecr-repository"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| créer 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 | 

### Création des composants AWS Batch
<a name="create-the-aws-batch-components"></a>


| Sous-tâche | Description | Compé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 de tâches 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 | 

### Création et planification d'une fonction Lambda
<a name="create-and-schedule-a-lambda-function"></a>


| Sous-tâche | Description | Compé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 | 

### Testez l'automatisation des sauvegardes
<a name="test-the-backup-automation"></a>


| Sous-tâche | Description | Compé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` `test`et `test1` sont des noms de base 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
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-resources"></a>

**Création d'une table d'inventaire dans DynamoDB**
+ [Création d'une table Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)

 

**Création d'une rubrique SNS pour les échecs de tâches dans AWS Batch**
+ [Création d'une rubrique Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)
+ [Envoyer des alertes SNS en cas d'échec d'une tâche dans AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/batch_sns_tutorial.html)

 

**Créez une image Docker et envoyez-la vers un référentiel Amazon ECR**
+ [Création d'un référentiel Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)    
+ [Écrivez un Dockerfile, créez une image Docker et envoyez-la vers Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

 

**Création des composants AWS Batch**
+ [Création d'une définition de tâche AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-1)    
+ [Configuration de votre environnement informatique et de la file d'attente des tâches AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-2)   
+ [Création d'une file d'attente de tâches dans AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/create-job-queue.html)

 

**Création d'une fonction Lambda**
+ [Création d'une fonction Lambda et écriture de code](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)
+ [Utiliser Lambda avec DynamoDB](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html)

 

**Création d'un CloudWatch événement**
+ [Création d'un CloudWatch événement basé sur le temps](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)   
+ [Utiliser des expressions cron dans Cloudwatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)

 

**Testez l'automatisation des sauvegardes**
+ [Création d'une clé Amazon KMS](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)    
+ [Création d'un secret dans le Gestionnaire de Secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)
+ [Ajouter des balises à une instance Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)

## Informations supplémentaires
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-additional"></a>

**É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 "$@"
```