如何实现AWS PostgreSQL数据库快照的每日自动恢复?
当然可以实现!我来给你拆解两种靠谱的AWS原生自动化方案
不管你是喜欢写点轻量代码,还是更倾向于无代码配置,都能搞定每日自动恢复快照到报表实例的需求:
方案一:Lambda + EventBridge(原CloudWatch Events)—— 灵活可控的代码方案
这是最常用的方案,用Lambda写逻辑,EventBridge定时触发,完全自定义流程:
步骤1:编写Lambda函数逻辑
用Python或Node.js都可以,这里给你一个Python示例(依赖boto3库,Lambda默认内置),核心逻辑是找最新快照→删除旧报表实例→恢复新实例:
import boto3 from botocore.exceptions import ClientError def lambda_handler(event, context): rds_client = boto3.client('rds') # 替换成你的源实例ID和报表实例ID source_db_id = "your-source-postgres-instance" target_db_id = "your-report-postgres-instance" # 1. 获取指定源实例的最新自动化快照(如果是手动快照,把SnapshotType改成'manual') try: snapshots = rds_client.describe_db_snapshots( DBInstanceIdentifier=source_db_id, SnapshotType='automated' )['DBSnapshots'] except ClientError as e: print(f"获取快照失败: {e.response['Error']['Message']}") raise # 按创建时间排序,取最新的那个 latest_snapshot = sorted(snapshots, key=lambda x: x['SnapshotCreateTime'], reverse=True)[0] latest_snapshot_id = latest_snapshot['DBSnapshotIdentifier'] print(f"将使用最新快照: {latest_snapshot_id}") # 2. 删除已存在的旧报表实例(如果有) try: rds_client.delete_db_instance( DBInstanceIdentifier=target_db_id, SkipFinalSnapshot=True # 不需要保留旧实例的快照 ) # 等待实例删除完成,避免恢复时冲突 waiter = rds_client.get_waiter('db_instance_deleted') waiter.wait(DBInstanceIdentifier=target_db_id) print(f"旧报表实例 {target_db_id} 已删除") except ClientError as e: if e.response['Error']['Code'] == 'DBInstanceNotFound': print("未找到旧报表实例,直接恢复") else: print(f"删除旧实例失败: {e.response['Error']['Message']}") raise # 3. 恢复快照到新的报表实例 try: restore_response = rds_client.restore_db_instance_from_db_snapshot( DBInstanceIdentifier=target_db_id, DBSnapshotIdentifier=latest_snapshot_id, # 替换成你的报表实例配置 DBInstanceClass='db.t3.small', VpcSecurityGroupIds=['sg-xxxxxxxxxxxx'], AvailabilityZone='us-east-1a', PubliclyAccessible=False, Tags=[{'Key': 'Purpose', 'Value': 'Reporting'}] ) print(f"恢复任务已启动,实例ID: {restore_response['DBInstance']['DBInstanceIdentifier']}") return restore_response except ClientError as e: print(f"恢复快照失败: {e.response['Error']['Message']}") raise
步骤2:配置Lambda的IAM权限
给Lambda角色添加以下权限(可以通过IAM策略编辑器配置):
rds:DescribeDBSnapshots:允许查看快照列表rds:DeleteDBInstance:允许删除旧报表实例rds:RestoreDBInstanceFromDBSnapshot:允许恢复快照logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents:允许Lambda记录日志,方便排查问题
步骤3:设置定时触发
打开EventBridge控制台,创建一个规则:
- 选择“计划”类型,用Cron表达式设置每日执行时间(比如凌晨2点就是
0 2 * * ? *) - 目标选择你的Lambda函数,完成配置即可
方案二:Systems Manager Automation —— 无代码快速配置
如果你不想写代码,AWS已经预制了自动化文档,直接用就行:
- 打开Systems Manager控制台,进入自动化页面,点击“执行自动化”
- 在文档列表中搜索
AWS-RestoreRDSFromSnapshot,选择这个预制文档 - 配置参数:
- 选择快照的筛选方式(比如按源实例ID,自动选最新快照)
- 填写目标实例的ID、实例类型、安全组等配置
- 勾选“DeleteExistingInstance”选项,自动删除旧报表实例
- 完成配置后,可以直接执行测试,也可以在页面中设置计划执行,指定每日运行时间
几个关键注意事项
- 兼容配置:目标实例的DB引擎版本、存储类型要和快照兼容,避免恢复失败
- 连接稳定性:如果报表应用用固定端点连接,保持目标实例ID不变,恢复后端点会自动复用
- 失败通知:可以给Lambda或Systems Manager配置SNS通知,执行成功/失败时自动发邮件或消息提醒
- 测试验证:先手动执行一次流程,确认权限、配置都没问题再开定时
内容的提问来源于stack exchange,提问作者marcia12
相关产品推荐
相关产品推荐

