如何自动将RDS快照备份至S3存储?
核心结论
必须借助EventBridge服务实现。RDS原生仅支持在设置的保留周期(你当前配置的7天)内自动生成、留存实例快照,没有内置自动将快照导出到S3的功能,所有自动触发导出的逻辑,都需要通过EventBridge捕获RDS的快照生成事件,再触发后续导出动作完成。
前置准备
在配置自动导出前先完成以下基础准备:
- 确认目标RDS实例的自动备份功能已正常开启,你当前设置的7天保留周期满足基础要求,自动快照会按你设置的备份窗口自动生成
- 提前创建和RDS实例同区域的S3存储桶作为备份目标,建议提前关闭桶的公网访问权限,避免备份数据泄露
- 准备好两类IAM权限角色:一类是给RDS服务授权的角色,允许RDS将导出的快照文件写入目标S3桶;另一类是给触发链路(Lambda/Systems Manager)授权的角色,允许其调用RDS快照导出接口、传递参数
- 提前在KMS中创建客户管理密钥(CMK),RDS快照导出到S3强制要求加密,不支持使用RDS默认托管密钥完成导出。
具体配置方案
你可以根据自己的技术习惯选以下两种方案,都能实现自动导出:
方案1:EventBridge + Lambda(自定义程度最高)
适合需要加自定义逻辑(比如过滤特定实例、备份完成后发通知、自定义备份命名规则)的场景:
- 第一步:给Lambda函数配置执行角色,附加三类权限:RDS快照查询、导出任务触发权限,目标S3桶的写入权限,以及Lambda基础的CloudWatch日志写入权限方便排查问题
- 第二步:编写Lambda函数,核心逻辑非常简单:接收EventBridge传递的事件参数,过滤出你需要备份的RDS实例对应的自动快照ID,调用boto3的
export_db_snapshot_to_s3接口,传入目标S3桶名、提前准备好的RDS访问角色ARN、KMS密钥ID即可。可以在代码里加判断逻辑,只处理目标实例的自动快照创建事件,避免误导出其他实例的快照 - 第三步:在EventBridge控制台创建事件规则,事件源选择AWS官方事件,服务选择RDS,事件类型匹配「RDS 自动快照创建完成」,可以额外加过滤条件指定目标RDS实例ID,过滤掉无关事件
- 第四步:将之前创建的Lambda函数设置为该EventBridge规则的触发目标,保存规则即可生效
注意:RDS快照导出到S3是异步执行任务,Lambda触发接口调用成功后即可退出,不需要等待任务跑完,不会产生多余的计算费用。
方案2:EventBridge + Systems Manager 自动化(零代码)
如果不想自己写代码维护Lambda,可以直接用平台预置的自动化能力:
- 第一步:在Systems Manager控制台的自动化文档列表里,找到预置的RDS快照导出到S3的官方文档
- 第二步:创建EventBridge规则,和方案1一样匹配RDS自动快照创建完成事件,触发目标选择「Systems Manager 自动化执行」,选中刚才找到的官方导出文档
- 第三步:在自动化执行的参数配置里,填好目标S3桶名、KMS密钥ARN、RDS访问角色ARN,设置快照ID参数从EventBridge传递的事件内容里动态获取,给Systems Manager配置好对应执行权限后保存规则即可。
配置后验证
- 配置完成后可以在EventBridge里发送测试事件,模拟RDS自动快照创建的场景,验证整条链路是否能正常触发导出任务
- 等到下一次RDS自动备份窗口,在RDS控制台的「快照导出任务」页面查看是否有自动生成的导出任务
- 导出任务完成后,到目标S3桶内检查备份文件是否完整存在即可。
补充说明
- 导出到S3的快照是独立于RDS原生自动备份存在的,就算7天保留周期到期后RDS自动删除了原生快照,S3里的备份也不会受影响。你可以给S3桶配置生命周期规则,自动删除超期的旧备份,长期归档的成本比存在RDS快照存储里低很多
- 整个流程会产生三部分费用:RDS快照导出的接口费用、S3存储费用、Lambda/EventBridge/Systems Manager的调用费用,其中事件触发和Lambda的调用费用极低,几乎可以忽略,主要成本在S3存储部分
- 如果需要跨账号备份,只需要在S3桶策略里给对应备份账号授予写入权限即可,不需要额外调整触发逻辑。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

