Automatizza i backup per le istanze DB di Amazon RDS for PostgreSQL utilizzando AWS Batch - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Automatizza i backup per le istanze DB di Amazon RDS for PostgreSQL utilizzando AWS Batch

Creato da Kirankumar Chandrashekar (AWS)

Ambiente: PoC o pilota

Tecnologie: contenitori e microservizi; database; DevOps

Carico di lavoro: tutti gli altri carichi di lavoro

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

Riepilogo

Il backup dei database PostgreSQL è un'attività importante e in genere può essere completata con l'utilità pg_dump, che utilizza il comando COPY per impostazione predefinita per creare uno schema e un dump dei dati di un database PostgreSQL. Tuttavia, questo processo può diventare ripetitivo se sono necessari backup regolari per più database PostgreSQL. Se i tuoi database PostgreSQL sono ospitati nel cloud, puoi anche sfruttare la funzionalità di backup automatico fornita da Amazon Relational Database Service (Amazon RDS) anche per PostgreSQL. Questo modello descrive come automatizzare i backup regolari per le istanze DB Amazon RDS for PostgreSQL utilizzando l'utilità pg_dump.

Nota: le istruzioni presuppongono che tu stia utilizzando Amazon RDS. Tuttavia, puoi utilizzare questo approccio anche per i database PostgreSQL ospitati all'esterno di Amazon RDS. Per eseguire i backup, la funzione AWS Lambda deve essere in grado di accedere ai database.

Un evento Amazon CloudWatch Events basato sul tempo avvia una funzione Lambda che cerca tag di backup specifici applicati ai metadati delle istanze DB PostgreSQL su Amazon RDS. Se le istanze DB PostgreSQL hanno il tag bkp:AutomatedDBDump = Active e altri tag di backup richiesti, la funzione Lambda invia singoli job per ogni backup del database ad AWS Batch. 

AWS Batch elabora questi processi e carica i dati di backup in un bucket Amazon Simple Storage Service (Amazon S3). Questo modello utilizza un Dockerfile e un file entrypoint.sh per creare un'immagine del contenitore Docker che viene utilizzata per eseguire backup nel job AWS Batch. Una volta completato il processo di backup, AWS Batch registra i dettagli del backup in una tabella di inventario su Amazon DynamoDB. Come ulteriore protezione, un evento CloudWatch Events avvia una notifica Amazon Simple Notification Service (Amazon SNS) se un processo fallisce in AWS Batch. 

Prerequisiti e limitazioni

Prerequisiti

Architettura

Stack tecnologico

  • CloudWatch Eventi 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

Strumenti

  • Amazon CloudWatch Events — CloudWatch Events offre un flusso quasi in tempo reale di eventi di sistema che descrivono i cambiamenti nelle risorse AWS.

  • Amazon DynamoDB — DynamoDB è un servizio di database NoSQL completamente gestito che offre prestazioni veloci e prevedibili con una scalabilità perfetta.

  • Amazon ECR — Amazon Elastic Container Registry (Amazon ECR) è un servizio di registro di immagini di container AWS gestito che è sicuro, scalabile e affidabile.

  • Amazon RDS — Amazon Relational Database Service (Amazon RDS) è un servizio Web che semplifica la configurazione, il funzionamento e la scalabilità di un database relazionale nel cloud AWS.

  • Amazon SNS — Amazon Simple Notification Service (Amazon SNS) è un servizio gestito che fornisce il recapito dei messaggi dagli editori agli abbonati.

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) è uno storage per Internet.

  • AWS Batch: AWS Batch ti aiuta a eseguire carichi di lavoro di elaborazione in batch sul cloud AWS.

  • AWS KMS — AWS Key Management Service (AWS KMS) è un servizio gestito che semplifica la creazione e il controllo delle chiavi di crittografia utilizzate per crittografare i dati.

  • AWS Lambda — Lambda è un servizio di elaborazione che ti aiuta a eseguire codice senza effettuare il provisioning o gestire server.

  • AWS Secrets Manager — Secrets Manager ti aiuta a sostituire le credenziali hardcoded nel codice, incluse le password, con una chiamata API a Secrets Manager per recuperare il segreto a livello di codice.

  • Docker — Docker aiuta gli sviluppatori a imballare, spedire ed eseguire facilmente qualsiasi applicazione come contenitore leggero, portatile e autosufficiente.

Le tue istanze DB PostgreSQL su Amazon RDS devono avere tag applicati ai relativi metadati. La funzione Lambda cerca i tag per identificare le istanze DB di cui eseguire il backup e in genere vengono utilizzati i tag seguenti.

Tag

Descrizione

BKP: AutomatedDBDump = Active

Identifica un'istanza DB Amazon RDS come candidata per i backup.

bkp: = AutomatedBackupSecret <secret_name >

Identifica il segreto di Secrets Manager che contiene le credenziali di accesso di Amazon RDS.

BKP: AutomatedDBDumps3bucket = <s3_bucket_name>

Identifica il bucket S3 a cui inviare i backup.

BKP: DB automatizzato DumpFrequency

BKP: DB automatizzato DumpTime

Identifica la frequenza e gli orari in cui eseguire il backup dei database. 

bkp: comando pgdump = <pgdump_command>

Identifica i database per i quali devono essere eseguiti i backup.

Epiche

AttivitàDescrizioneCompetenze richieste
Crea una tabella in DynamoDB.

Accedi alla Console di gestione AWS, apri la console Amazon DynamoDB e crea una tabella. Per assistenza su questa e altre storie, consulta la sezione Risorse correlate.

Amministratore del cloud, amministratore del database
Conferma che la tabella è stata creata.

Esegui il comando aws dynamodb describe-table --table-name <table-name> | grep TableStatus. Se la tabella esiste, il comando restituirà il "TableStatus": "ACTIVE", risultato.

Amministratore del cloud, amministratore del database
AttivitàDescrizioneCompetenze richieste
Creare un argomento SNS.

Apri la console Amazon SNS, scegli Argomenti e crea un argomento SNS con il nome. JobFailedAlert Sottoscrivi un indirizzo e-mail attivo all'argomento e controlla la tua casella di posta elettronica per confermare l'e-mail di iscrizione a SNS da AWS Notifications.

Amministratore del cloud
Crea una regola relativa agli eventi di lavoro non riusciti per AWS Batch.

Apri la CloudWatch console Amazon, scegli Eventi, quindi scegli Crea regola. Scegli Mostra opzioni avanzate e scegli Modifica. Per Crea un pattern che seleziona gli eventi da elaborare in base ai tuoi obiettivi, sostituisci il testo esistente con il codice «Failed job event» nella sezione Informazioni aggiuntive. Questo codice definisce una regola CloudWatch Events che viene avviata quando AWS Batch ha un Failed evento.

Amministratore cloud
Aggiungi l'obiettivo della regola dell'evento.

In Target, scegli Aggiungi obiettivi e scegli l'argomento JobFailedAlert SNS. Configura i dettagli rimanenti e crea la regola Cloudwatch Events.

Amministratore cloud
AttivitàDescrizioneCompetenze richieste
Crea un repository Amazon ECR.

Apri la console Amazon ECR e scegli la regione AWS in cui desideri creare il tuo repository. Scegli Repositories, quindi scegli Crea repository. Configura il repository in base alle tue esigenze.

Amministratore cloud
Scrivi un Dockerfile.

Accedi a Docker e usa «Sample Dockerfile» e «Sample entrypoint.sh file» dalla sezione Informazioni aggiuntive per creare un Dockerfile.

DevOps ingegnere
Crea un'immagine Docker e inviala al repository Amazon ECR.

Crea il Dockerfile in un'immagine Docker e invialo al repository Amazon ECR. Per informazioni su questa storia, consulta la sezione Risorse correlate.

DevOps ingegnere
AttivitàDescrizioneCompetenze richieste
Crea una definizione di processo AWS Batch.

Apri la console AWS Batch e crea una definizione di processo che includa l'URI (Uniform Resource Identifier) del repository Amazon ECR come proprietà. Image

Amministratore cloud
Configura la coda dei job di AWS Batch.

Nella console AWS Batch, scegli Job queues, quindi scegli Create queue. Crea una coda di lavoro che memorizzerà i lavori fino a quando AWS Batch non li eseguirà sulle risorse all'interno del tuo ambiente di calcolo. Importante: assicurati di scrivere la logica per AWS Batch per registrare i dettagli del backup nella tabella di inventario di DynamoDB.

Amministratore cloud
AttivitàDescrizioneCompetenze richieste
Crea una funzione Lambda per cercare i tag.

Crea una funzione Lambda che cerca i tag nelle tue istanze DB PostgreSQL e identifica i candidati al backup. Assicurati che la tua funzione Lambda sia in grado di identificare il bkp:AutomatedDBDump = Active tag e tutti gli altri tag richiesti. Importante: la funzione Lambda deve anche essere in grado di aggiungere lavori alla coda di lavori di AWS Batch.

DevOps ingegnere
Crea un evento CloudWatch Events basato sul tempo.

Apri la CloudWatch console Amazon e crea un evento CloudWatch Events che utilizzi un'espressione cron per eseguire la funzione Lambda a intervalli regolari. Importante: tutti gli eventi pianificati utilizzano il fuso orario UTC.

Amministratore cloud
AttivitàDescrizioneCompetenze richieste
Crea una chiave Amazon KMS.

Apri la console Amazon KMS e crea una chiave KMS che può essere utilizzata per crittografare le credenziali Amazon RDS archiviate in AWS Secrets Manager.

Amministratore cloud
Crea un segreto di AWS Secrets Manager.

Apri la console AWS Secrets Manager e archivia le credenziali del database Amazon RDS for PostgreSQL come segreto.

Amministratore cloud
Aggiungi i tag richiesti alle istanze DB PostgreSQL.

Apri la console Amazon RDS e aggiungi tag alle istanze DB PostgreSQL di cui desideri eseguire il backup automatico. Puoi utilizzare i tag della tabella nella sezione Strumenti. Se hai bisogno di backup da più database PostgreSQL all'interno della stessa istanza Amazon RDS, usali come valore per -d test:-d test1 il tag. bkp:pgdumpcommand Importante: test e sono nomi di database. test1 Assicurati che non ci sia spazio dopo i due punti (:).

Amministratore cloud
Verifica l'automazione del backup.

Per verificare l'automazione del backup, puoi richiamare la funzione Lambda o attendere l'inizio della pianificazione del backup. Una volta completato il processo di backup, verifica che la tabella di inventario di DynamoDB contenga una voce di backup valida per le tue istanze DB PostgreSQL. Se corrispondono, il processo di automazione del backup ha esito positivo.

Amministratore cloud

Risorse correlate

Creare una tabella di inventario in DynamoDB

 

Crea un argomento SNS per gli eventi di job non riusciti in AWS Batch

 

Crea un'immagine Docker e inviala a un repository Amazon ECR

 

Crea i componenti AWS Batch

 

Creare una funzione Lambda

 

Crea un evento Events CloudWatch

 

Prova l'automazione del backup

Informazioni aggiuntive

Evento di processo non riuscito:

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

Dockerfile di esempio:

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

File entrypoint.sh di esempio:

#!/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 "$@"