Automatisieren Sie Backups für Amazon RDS for PostgreSQL PostgreSQL-DB-Instances mithilfe von AWS Batch - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Automatisieren Sie Backups für Amazon RDS for PostgreSQL PostgreSQL-DB-Instances mithilfe von AWS Batch

Erstellt von Kirankumar Chandrashekar (AWS)

Umgebung: PoC oder Pilotprojekt

Technologien: Container und Mikroservices; Datenbanken; DevOps

Arbeitslast: Alle anderen Workloads

AWS-Dienste: Amazon RDS; AWS Batch; Amazon CloudWatch; AWS Lambda; Amazon S3

Übersicht

Das Sichern Ihrer PostgreSQL-Datenbanken ist eine wichtige Aufgabe und kann in der Regel mit dem Hilfsprogramm pg_dump erledigt werden, das standardmäßig den Befehl COPY verwendet, um ein Schema und einen Datendump einer PostgreSQL-Datenbank zu erstellen. Dieser Vorgang kann sich jedoch wiederholen, wenn Sie regelmäßige Backups für mehrere PostgreSQL-Datenbanken benötigen. Wenn Ihre PostgreSQL-Datenbanken in der Cloud gehostet werden, können Sie auch die automatische Backup-Funktion von Amazon Relational Database Service (Amazon RDS) für PostgreSQL nutzen. Dieses Muster beschreibt, wie regelmäßige Backups für Amazon RDS for PostgreSQL PostgreSQL-DB-Instances mithilfe des Dienstprogramms pg_dump automatisiert werden.

Hinweis: In den Anweisungen wird davon ausgegangen, dass Sie Amazon RDS verwenden. Sie können diesen Ansatz jedoch auch für PostgreSQL-Datenbanken verwenden, die außerhalb von Amazon RDS gehostet werden. Um Backups zu erstellen, muss die AWS Lambda Lambda-Funktion auf Ihre Datenbanken zugreifen können.

Ein zeitbasiertes Amazon CloudWatch Events-Ereignis initiiert eine Lambda-Funktion, die nach bestimmten Backup-Tags sucht, die auf die Metadaten der PostgreSQL-DB-Instances auf Amazon RDS angewendet wurden. Wenn die PostgreSQL-DB-Instances das Tag bkp:AutomatedDBDump = Active und andere erforderliche Backup-Tags haben, sendet die Lambda-Funktion einzelne Jobs für jedes Datenbank-Backup an AWS Batch. 

AWS Batch verarbeitet diese Jobs und lädt die Backup-Daten in einen Amazon Simple Storage Service (Amazon S3) -Bucket hoch. Dieses Muster verwendet eine Dockerfile- und eine Datei entrypoint.sh, um ein Docker-Container-Image zu erstellen, das zum Erstellen von Backups im AWS Batch Batch-Job verwendet wird. Nach Abschluss des Sicherungsvorgangs zeichnet AWS Batch die Backup-Details in einer Inventartabelle auf Amazon DynamoDB auf. Als zusätzliche Schutzmaßnahme löst ein CloudWatch Events-Ereignis eine Amazon Simple Notification Service (Amazon SNS) -Benachrichtigung aus, wenn ein Job in AWS Batch fehlschlägt. 

Voraussetzungen und Einschränkungen

Voraussetzungen

Architektur

Architektur zur Sicherung von Amazon RDS for PostgreSQL PostgreSQL-DB-Instances mithilfe des Dienstprogramms pg_dump.

Technologie-Stack

  • CloudWatch Amazon-Veranstaltungen

  • 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

Tools

  • Amazon CloudWatch Events — CloudWatch Events bietet einen Stream von Systemereignissen, die Änderungen an AWS-Ressourcen beschreiben, nahezu in Echtzeit.

  • Amazon DynamoDB — DynamoDB ist ein vollständig verwalteter NoSQL-Datenbankservice, der schnelle und vorhersehbare Leistung mit nahtloser Skalierbarkeit bietet.

  • Amazon ECR — Amazon Elastic Container Registry (Amazon ECR) ist ein verwalteter AWS-Container-Image-Registry-Service, der sicher, skalierbar und zuverlässig ist.

  • Amazon RDS — Amazon Relational Database Service (Amazon RDS) ist ein Webservice, der die Einrichtung, den Betrieb und die Skalierung einer relationalen Datenbank in der AWS-Cloud erleichtert.

  • Amazon SNS — Amazon Simple Notification Service (Amazon SNS) ist ein verwalteter Service, der die Nachrichtenzustellung von Herausgebern an Abonnenten ermöglicht.

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) ist ein Speicher für das Internet.

  • AWS Batch — Mit AWS Batch können Sie Batch-Computing-Workloads in der AWS-Cloud ausführen.

  • AWS KMS — AWS Key Management Service (AWS KMS) ist ein verwalteter Service, mit dem Sie auf einfache Weise die zur Verschlüsselung Ihrer Daten verwendeten Verschlüsselungsschlüssel erstellen und kontrollieren können.

  • AWS Lambda — Lambda ist ein Rechenservice, mit dem Sie Code ausführen können, ohne Server bereitstellen oder verwalten zu müssen.

  • AWS Secrets Manager — Secrets Manager hilft Ihnen dabei, hartcodierte Anmeldeinformationen in Ihrem Code, einschließlich Passwörter, durch einen API-Aufruf an Secrets Manager zu ersetzen, um das Geheimnis programmgesteuert abzurufen.

  • Docker — Docker hilft Entwicklern dabei, jede Anwendung als leichten, tragbaren und autarken Container einfach zu packen, zu versenden und auszuführen.

Auf Ihre PostgreSQL-DB-Instances auf Amazon RDS müssen Tags auf ihre Metadaten angewendet werden. Die Lambda-Funktion sucht nach Tags, um DB-Instances zu identifizieren, die gesichert werden sollten, und die folgenden Tags werden normalerweise verwendet.

Markierung

Beschreibung

bkp:AutomatedDBDump = Aktiv

Identifiziert eine Amazon RDS-DB-Instance als Kandidaten für Backups.

bkp: = AutomatedBackupSecret <secret_name >

Identifiziert das Secrets Manager Manager-Geheimnis, das die Amazon RDS-Anmeldeinformationen enthält.

bkp: AutomatedDBDumps3Bucket = <s3_bucket_name>

Identifiziert den S3-Bucket, an den Backups gesendet werden sollen.

BKP: AutomatedDB DumpFrequency

BKP:AutomatedDB DumpTime

Identifizieren Sie die Häufigkeit und die Zeiten, zu denen Datenbanken gesichert werden sollten. 

bkp:pgdumpcommand = <pgdump_command>

Identifiziert die Datenbanken, für die die Backups erstellt werden müssen.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Tabelle in DynamoDB.

Melden Sie sich bei der AWS-Managementkonsole an, öffnen Sie die Amazon DynamoDB DynamoDB-Konsole und erstellen Sie eine Tabelle. Hilfe zu dieser und anderen Geschichten finden Sie im Abschnitt Verwandte Ressourcen.

Cloud-Administrator, Datenbankadministrator

Vergewissern Sie sich, dass die Tabelle erstellt wurde.

Führen Sie den Befehl aws dynamodb describe-table --table-name <table-name> | grep TableStatus aus. Wenn die Tabelle existiert, gibt der Befehl das "TableStatus": "ACTIVE", Ergebnis zurück.

Cloud-Administrator, Datenbankadministrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie ein SNS-Thema.

Öffnen Sie die Amazon SNS SNS-Konsole, wählen Sie Themen und erstellen Sie ein SNS-Thema mit dem Namen. JobFailedAlert Abonnieren Sie das Thema mit einer aktiven E-Mail-Adresse und überprüfen Sie Ihren E-Mail-Posteingang, um die SNS-Abonnement-E-Mail von AWS Notifications zu bestätigen.

Cloud-Administrator

Erstellen Sie eine Ereignisregel für fehlgeschlagene Jobs für AWS Batch.

Öffnen Sie die CloudWatch Amazon-Konsole, wählen Sie Ereignisse und dann Regel erstellen aus. Wählen Sie „Erweiterte Optionen anzeigen“ und anschließend „Bearbeiten“. Ersetzen Sie unter „Ein Muster erstellen, das Ereignisse für die Verarbeitung durch Ihre Ziele auswählt“ den vorhandenen Text durch den Code „Fehlgeschlagenes Auftragsereignis“ aus dem Abschnitt „Zusätzliche Informationen“. Dieser Code definiert eine CloudWatch Ereignisregel, die ausgelöst wird, wenn AWS Batch ein Failed Ereignis hat.

Cloud-Administrator

Fügen Sie ein Ziel für eine Ereignisregel hinzu.

Wählen Sie unter Ziele die Option Ziele hinzufügen und wählen Sie das JobFailedAlert SNS-Thema aus. Konfigurieren Sie die verbleibenden Details und erstellen Sie die Cloudwatch Events-Regel.

Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie ein Amazon-ECR-Repository.

Öffnen Sie die Amazon ECR-Konsole und wählen Sie die AWS-Region aus, in der Sie Ihr Repository erstellen möchten. Wählen Sie Repositories und dann Create repository aus. Konfigurieren Sie das Repository gemäß Ihren Anforderungen.

Cloud-Administrator

Schreiben Sie eine Docker-Datei.

Melden Sie sich bei Docker an und verwenden Sie die „Beispieldatei Dockerfile“ und „Beispieldatei entrypoint.sh“ aus dem Abschnitt Zusätzliche Informationen, um ein Dockerfile zu erstellen.

DevOps Ingenieur

Erstellen Sie ein Docker-Image und übertragen Sie es in das Amazon ECR-Repository.

Erstellen Sie das Dockerfile in ein Docker-Image und übertragen Sie es in das Amazon ECR-Repository. Hilfe zu dieser Geschichte finden Sie im Abschnitt Verwandte Ressourcen.

DevOps Ingenieur
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine AWS Batch Batch-Auftragsdefinition.

Öffnen Sie die AWS Batch Batch-Konsole und erstellen Sie eine Auftragsdefinition, die den Uniform Resource Identifier (URI) des Amazon ECR-Repositorys als Eigenschaft Image enthält.

Cloud-Administrator

Konfigurieren Sie die AWS Batch Batch-Jobwarteschlange.

Wählen Sie in der AWS Batch Batch-Konsole Job-Warteschlangen und anschließend Warteschlange erstellen aus. Erstellen Sie eine Auftragswarteschlange, in der Jobs gespeichert werden, bis AWS Batch sie auf den Ressourcen in Ihrer Rechenumgebung ausführt. Wichtig: Stellen Sie sicher, dass Sie Logik für AWS Batch schreiben, um die Backup-Details in der DynamoDB-Inventartabelle aufzuzeichnen.

Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Lambda-Funktion, um nach Tags zu suchen.

Erstellen Sie eine Lambda-Funktion, die nach Tags in Ihren PostgreSQL-DB-Instances sucht und Backup-Kandidaten identifiziert. Stellen Sie sicher, dass Ihre Lambda-Funktion das bkp:AutomatedDBDump = Active Tag und alle anderen erforderlichen Tags identifizieren kann. Wichtig: Die Lambda-Funktion muss auch in der Lage sein, Jobs zur AWS Batch Batch-Jobwarteschlange hinzuzufügen.

DevOps Ingenieur

Erstellen Sie ein zeitbasiertes Ereignis für CloudWatch Ereignisse.

Öffnen Sie die CloudWatch Amazon-Konsole und erstellen Sie ein CloudWatch Events-Ereignis, das einen Cron-Ausdruck verwendet, um Ihre Lambda-Funktion regelmäßig auszuführen. Wichtig: Alle geplanten Ereignisse verwenden die UTC-Zeitzone.

Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie einen Amazon KMS-Schlüssel.

Öffnen Sie die Amazon KMS-Konsole und erstellen Sie einen KMS-Schlüssel, der zur Verschlüsselung der in AWS Secrets Manager gespeicherten Amazon RDS-Anmeldeinformationen verwendet werden kann.

Cloud-Administrator

Erstellen Sie ein AWS Secrets Manager Manager-Geheimnis.

Öffnen Sie die AWS Secrets Manager Manager-Konsole und speichern Sie Ihre Amazon RDS for PostgreSQL PostgreSQL-Datenbankanmeldedaten als geheim.

Cloud-Administrator

Fügen Sie den PostgreSQL-DB-Instances die erforderlichen Tags hinzu.

Öffnen Sie die Amazon RDS-Konsole und fügen Sie Tags zu den PostgreSQL-DB-Instances hinzu, die Sie automatisch sichern möchten. Sie können die Tags aus der Tabelle im Abschnitt Tools verwenden. Wenn Sie Backups von mehreren PostgreSQL-Datenbanken innerhalb derselben Amazon RDS-Instance benötigen, verwenden Sie diese -d test:-d test1 als Wert für das bkp:pgdumpcommand Tag. Wichtig: test und test1 sind Datenbanknamen. Stellen Sie sicher, dass nach dem Doppelpunkt (:) kein Leerzeichen steht.

Cloud-Administrator

Überprüfen Sie die Backup-Automatisierung.

Um die Backup-Automatisierung zu überprüfen, können Sie entweder die Lambda-Funktion aufrufen oder warten, bis der Backup-Zeitplan beginnt. Überprüfen Sie nach Abschluss des Sicherungsvorgangs, ob die DynamoDB-Inventartabelle einen gültigen Backup-Eintrag für Ihre PostgreSQL-DB-Instances enthält. Wenn sie übereinstimmen, ist der Backup-Automatisierungsprozess erfolgreich.

Cloud-Administrator

Zugehörige Ressourcen

Erstellen Sie eine Inventartabelle in DynamoDB

 

Erstellen Sie ein SNS-Thema für fehlgeschlagene Auftragsereignisse in AWS Batch

 

Erstellen Sie ein Docker-Image und übertragen Sie es in ein Amazon ECR-Repository

 

Erstellen Sie die AWS Batch Batch-Komponenten

 

Erstellen Sie eine Lambda-Funktion

 

Erstellen Sie ein Veranstaltungsereignis CloudWatch

 

Testen Sie die Backup-Automatisierung

Zusätzliche Informationen

Fehlgeschlagenes Auftragsereignis:

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

Beispiel für eine Docker-Datei:

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

Beispieldatei 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 "$@"