使用 Batc AWS h 自动备份亚马逊 RDS Postgre SQL 数据库实例 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Batc AWS h 自动备份亚马逊 RDS Postgre SQL 数据库实例

由 Kirankumar Chandrashekar 创作 () AWS

摘要

备份 Postgre SQL 数据库是一项重要的任务,通常可以使用 pg_dump 实用程序完成,该实用程序默认使用该COPY命令创建 Postgre 数据库的架构和数据转储。SQL但是,如果您需要定期备份多个 Postgre SQL 数据库,则此过程可能会变得重复。如果你的 Postgre SQL 数据库托管在云中,你也可以利用亚马逊关系数据库服务(亚马逊RDS)SQL为 Postgre 提供的自动备份功能。此模式描述了如何使用 pg_dump 实用程序自动为 Amazon RDS for Postgre SQL 数据库实例进行定期备份。

注意:这些说明假设您使用的是亚马逊RDS。但是,您也可以对托管在亚马逊RDS之外的 Postgre SQL 数据库使用这种方法。要进行备份,AWSLambda 函数必须能够访问您的数据库。

基于时间的亚马逊 CloudWatch 事件会启动 Lambda 函数,该函数搜索应用于亚马逊 Postgre 数据库实例SQL元数据的特定备份标签。RDS如果 Postgre SQL 数据库实例具有 bkp: A utomatedDBDump = Activ e 标签和其他必需的备份标签,则 Lambda 函数将每个数据库备份的单个任务提交到 Batch。AWS 

AWSBatch 处理这些任务并将备份数据上传到亚马逊简单存储服务 (Amazon S3) 存储桶。此模式使用 Dockerfile 和 entrypoint.sh 文件来构建 Docker 容器镜像,用于在批处理AWS作业中进行备份。备份过程完成后,B AWS atch 会将备份详细信息记录到亚马逊 DynamoDB 上的库存表中。作为额外的保护措施,如果任务在 Bat AWS ch 中失败, CloudWatch 事件事件会启动亚马逊简单通知服务 (AmazonSNS) 通知。 

先决条件和限制

先决条件

架构

使用 pg_dump 实用RDS程序为 Postgre SQL 数据库实例备份亚马逊的架构。

技术堆栈

  • 亚马逊 CloudWatch 活动

  • Amazon DynamoDB

  • 亚马逊弹性容器注册表(亚马逊ECR)

  • Amazon RDS

  • Amazon SNS

  • Amazon S3

  • AWS Batch

  • AWS密钥管理服务 (AWSKMS)

  • AWS Lambda

  • AWS Secrets Manager

  • Docker

工具

  • Amazon CloudWatch Ev CloudWatch ents — Events 提供近乎实时的系统事件流,这些事件描述了AWS资源的变化。

  • Amazon Dy namoDB — DynamoDB 是一项完全SQL托管的无数据库服务,可提供快速且可预测的性能以及无缝的可扩展性。

  • 亚马逊 ECR — 亚马逊弹性容器注册表 (AmazonECR) 是一项安全、可扩展且可靠的托管AWS容器镜像注册服务。

  • 亚马逊 RDS — Amazon Relational Database Service (AmazonRDS) 是一项网络服务,可以更轻松地在AWS云中设置、操作和扩展关系数据库。

  • 亚马逊 SNS — 亚马逊简单通知服务 (AmazonSNS) 是一项托管服务,可从发布者向订阅者传送消息。

  • Amazon S3 – Amazon Simple Storage Service (Amazon S3) 是一项面向互联网的存储服务。

  • AWSB atc AWS h — Batch 可帮助您在AWS云上运行批量计算工作负载。

  • AWSKMS— AWS 密钥管理服务 (AWSKMS) 是一项托管服务,可让您轻松创建和控制用于加密数据的加密密钥。

  • AWSLambd a — Lambda 是一项计算服务,可帮助您在不预配置或管理服务器的情况下运行代码。

  • AWSS@@ ecrets M anager — Secrets Manager 可帮助你将代码中的硬编码凭据(包括密码)替换为API调用 Secrets Manager 以编程方式检索密钥。

  • Docker - Docker 有助于开发人员轻松打包、交付和运行任何应用程序,将其作为轻量级、便携且自给自足的容器。

您在亚马逊上的 Postgre SQL 数据库实例RDS必须为其元数据应用标签。Lambda 函数搜索标签以识别应备份的数据库实例,这通常使用以下标签。

标签

描述

bkp: a = 活跃 utomatedDBDump

将 Amazon RDS 数据库实例标识为备份。

bkp: = AutomatedBackupSecret <secret_name >

识别包含亚马逊RDS登录凭证的 Secrets Manager 密钥。

bkp: a S3Bucket = utomatedDBDump <s3_bucket_name>

标识要向其发送备份的目标 S3 存储桶。

bkputomatedDBDump: a 频率

bkpautomatedDBDump: Time

确定数据库备份的频率和时间。 

bkp:pgdumpcommand = <pgdump_command>

标识需要对其执行备份的数据库。

操作说明

任务描述所需技能

在 DynamoDB 中创建表。

登录AWS管理控制台,打开 Amazon DynamoDB 控制台,然后创建表。要获取有关此操作和其他操作的帮助,请参阅相关资源部分。

云管理员、数据库管理员

确认已创建表格。

运行 aws dynamodb describe-table --table-name <table-name> | grep TableStatus命令。如果该表存在,则该命令将返回 "TableStatus": "ACTIVE", 结果。

云管理员、数据库管理员
任务描述所需技能

创建一个 SNS 主题。

打开 Amazon SNS 控制台,选择 Topics,然后创建一个名为SNS的主题JobFailedAlert为该主题订阅有效的电子邮件地址,然后查看您的电子邮件收件箱以确认来自 “AWS通知” 的SNS订阅电子邮件。

云管理员

为 Bat AWS ch 创建失败的作业事件规则。

打开 Amazon CloudWatch 控制台,选择事件,然后选择创建规则。选择显示高级选项,并选择编辑。对于构建模式,选择按您的目标处理的事件,将现有文本替换为其他信息部分的“失败作业事件”代码。此代码定义了在 Bat AWS ch 有 CloudWatch 事件时启动Failed的事件规则。

云管理员

添加事件规则目标。

目标中,选择添加目标,然后选择JobFailedAlertSNS主题。配置其余详细信息,并创建 Cloudwatch Events 规则。

云管理员
任务描述所需技能

创建亚马逊ECR存储库。

打开 Amazon ECR 控制台,然后选择要在其中创建存储库的AWS区域。选择存储库,然后选择创建存储库。根据要求配置存储库。

云管理员

撰写 Dockerfile。

登录 Docker,使用其他信息部分中的“示例 Dockerfile”和“样本 entrypoint.sh 文件”构建 Dockerfile。

DevOps 工程师

创建 Docker 镜像并将其推送到亚马逊ECR存储库。

将 Dockerfile 构建为 Docker 镜像并将其推送到亚马逊存储库。ECR有关此步骤的帮助,请参阅相关资源部分。

DevOps 工程师
任务描述所需技能

创建 AWS Batch 作业定义。

打开 AWS Batch 控制台并创建包含亚马逊ECR存储库的统一资源标识符 (URI) 作为属性的任务定义Image

云管理员

配置 AWS Batch 作业队列。

在 AWS Batch 控制台上,选择 Job 队列,然后选择创建队列。创建一个任务队列,该队列将存储作业,直到 AWS Batch 在计算环境中的资源上运行这些作业。重要:请务必为 B AWS atch 编写逻辑,以便将备份详细信息记录到 DynamoDB 清单表中。

云管理员
任务描述所需技能

创建 Lambda 函数以搜索标签。

创建一个 Lambda 函数,用于在您的 Postgre SQL 数据库实例上搜索标签并识别备用备份。确保您的 Lambda 函数可以识别 bkp:AutomatedDBDump = Active 标签和所有其他必需的标签。重要:Lambda 函数还必须能够向 Batc AWS h 任务队列中添加任务。

DevOps 工程师

创建基于时间 CloudWatch 的事件事件。

打开 Amazon CloudWatch 控制台并创建一个 CloudWatch 事件事件,该事件使用 cron 表达式定期运行您的 Lambda 函数。重要:所有预定活动都使用UTC时区。

云管理员
任务描述所需技能

创建 Amazon KMS 密钥。

打开亚马逊KMS控制台并创建一个KMS密钥,该密钥可用于加密存储在 S AWS ecrets Manager 中的亚马逊RDS凭证。

云管理员

创建 S AWS ecrets Manager 密钥。

打开 S AWS ecrets Manager 控制台,将你的 Amazon fo RDS r Postgre SQL 数据库凭证作为机密存储起来。

云管理员

向 Postgre SQL 数据库实例添加所需的标签。

重要

打开亚马逊RDS控制台,为要自动备份的 Postgre SQL 数据库实例添加标签。您可以使用工具部分表格中的标签。如果您需要从同一 Amazon RDS 实例中的多个 Postgre SQL 数据库进行备份,请使用-d test:-d test1作为bkp:pgdumpcommand标签的值。 testtest1是数据库名称。确保冒号 (:) 后没有空格。

云管理员

验证备份自动化。

若要验证备份自动化,您可以调用 Lambda 函数或等待备份计划开始。备份过程完成后,请检查 DynamoDB 清单表中是否包含适用于您SQL的 Postgre 数据库实例的有效备份条目。如果其匹配,则表示备份自动化过程成功。

云管理员

相关资源

在 DynamoDB 中创建清单表

 

在 Bat AWS ch 中为失败的作业事件创建SNS主题

 

构建 Docker 镜像并将其推送到亚马逊存储库 ECR

 

创建 AWS Batch 组件

 

创建 Lambda 函数

 

创建 CloudWatch 活动事件

 

测试备份自动化

其他信息

失败作业事件:

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

示例 Dockerfile:

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

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