本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Batc AWS h 自动备份亚马逊 RDS Postgre SQL 数据库实例
由 Kirankumar Chandrashekar 创作 () AWS
摘要
备份 Postgre SQL 数据库是一项重要的任务,通常可以使用 pg_dump 实用程序完成,该实用程序
注意:这些说明假设您使用的是亚马逊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) 通知。
先决条件和限制
先决条件
一个活动的 AWS 账户。
现有托管或非托管计算环境。有关更多信息,请参阅 B AWS atch 文档中的托管和非托管计算环境。
AWS命令行接口 (CLI) 版本 2 Docker 镜像,已安装并配置。
现有 Amazon RDS for Postgre SQL 数据库实例。
现有的 S3 存储桶。
Docker
,已在 Linux、macOS 或 Windows 上安装并配置。 熟悉 Lambda 编码。
架构
技术堆栈
亚马逊 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 控制台,然后创建表。要获取有关此操作和其他操作的帮助,请参阅相关资源部分。 | 云管理员、数据库管理员 |
确认已创建表格。 | 运行 | 云管理员、数据库管理员 |
任务 | 描述 | 所需技能 |
---|---|---|
创建一个 SNS 主题。 | 打开 Amazon SNS 控制台,选择 Topics,然后创建一个名为SNS的主题 | 云管理员 |
为 Bat AWS ch 创建失败的作业事件规则。 | 打开 Amazon CloudWatch 控制台,选择事件,然后选择创建规则。选择显示高级选项,并选择编辑。对于构建模式,选择按您的目标处理的事件,将现有文本替换为其他信息部分的“失败作业事件”代码。此代码定义了在 Bat AWS ch 有 CloudWatch 事件时启动 | 云管理员 |
添加事件规则目标。 | 在目标中,选择添加目标,然后选择 | 云管理员 |
任务 | 描述 | 所需技能 |
---|---|---|
创建亚马逊ECR存储库。 | 打开 Amazon ECR 控制台,然后选择要在其中创建存储库的AWS区域。选择存储库,然后选择创建存储库。根据要求配置存储库。 | 云管理员 |
撰写 Dockerfile。 | 登录 Docker,使用其他信息部分中的“示例 Dockerfile”和“样本 entrypoint.sh 文件”构建 Dockerfile。 | DevOps 工程师 |
创建 Docker 镜像并将其推送到亚马逊ECR存储库。 | 将 Dockerfile 构建为 Docker 镜像并将其推送到亚马逊存储库。ECR有关此步骤的帮助,请参阅相关资源部分。 | DevOps 工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
创建 AWS Batch 作业定义。 | 打开 AWS Batch 控制台并创建包含亚马逊ECR存储库的统一资源标识符 (URI) 作为属性的任务定义 | 云管理员 |
配置 AWS Batch 作业队列。 | 在 AWS Batch 控制台上,选择 Job 队列,然后选择创建队列。创建一个任务队列,该队列将存储作业,直到 AWS Batch 在计算环境中的资源上运行这些作业。重要:请务必为 B AWS atch 编写逻辑,以便将备份详细信息记录到 DynamoDB 清单表中。 | 云管理员 |
任务 | 描述 | 所需技能 |
---|---|---|
创建 Lambda 函数以搜索标签。 | 创建一个 Lambda 函数,用于在您的 Postgre SQL 数据库实例上搜索标签并识别备用备份。确保您的 Lambda 函数可以识别 | 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 数据库进行备份,请使用 | 云管理员 |
验证备份自动化。 | 若要验证备份自动化,您可以调用 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 "$@"