如何每日自动将AWS RDS PostgreSQL数据库备份存储至S3?
解决AWS Lambda中缺少psql工具无法备份RDS PostgreSQL的方案
方案1:通过Lambda层添加psql/pg_dump二进制文件
- 操作步骤:
- 在Amazon Linux 2环境(与Lambda运行环境一致)中,安装适配的PostgreSQL客户端工具:执行
sudo amazon-linux-extras install postgresql14,然后从/usr/bin目录复制pg_dump和psql二进制文件。 - 创建
bin目录,将复制的文件放入其中,打包成zip包(注意zip结构需直接包含bin目录,而非嵌套)。 - 在AWS控制台创建Lambda层,上传该zip包,选择与你的Lambda函数兼容的运行时(如Python 3.9/3.10)。
- 将层关联到备份Lambda函数,在函数代码中添加路径配置:
os.environ['PATH'] = os.environ['PATH'] + ':' + '/opt/bin'(Lambda层内容会挂载到/opt目录)。 - 配置完成后,脚本即可正常调用
pg_dump命令生成备份文件。
- 在Amazon Linux 2环境(与Lambda运行环境一致)中,安装适配的PostgreSQL客户端工具:执行
方案2:使用RDS自动快照+快照导出到S3
- 这是AWS原生备份方案,无需自定义脚本:
- 开启RDS实例的自动快照功能,在控制台数据库实例配置中设置每日备份的保留周期。
- 创建CloudWatch Events规则,定时触发Lambda函数(或直接用AWS CLI)执行快照导出:
- 用boto3调用
start_export_task方法,指定目标快照ARN、S3存储桶、具备RDS快照导出和S3写入权限的IAM角色。
- 用boto3调用
- 导出完成后,备份文件会自动存储到指定S3桶,还可配置S3生命周期规则自动清理旧备份。
方案3:用ECS Fargate/EC2运行备份脚本
- 适合需要高度自定义备份逻辑的场景:
- ECS Fargate:构建包含Python、psql工具的Docker镜像并推送到ECR,创建Fargate任务定义,通过CloudWatch Events定时触发任务执行备份脚本,任务完成后自动销毁容器。
- EC2实例:启动低成本EC2实例(如t3.nano),安装psql和Python环境,将备份脚本部署到实例上,通过
cron设置每日定时执行。需给实例配置具备RDS访问和S3写入权限的IAM角色。
内容的提问来源于stack exchange,提问作者rangarajan
相关产品推荐
相关产品推荐

