You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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已经预制了自动化文档,直接用就行:

  1. 打开Systems Manager控制台,进入自动化页面,点击“执行自动化”
  2. 在文档列表中搜索AWS-RestoreRDSFromSnapshot,选择这个预制文档
  3. 配置参数:
    • 选择快照的筛选方式(比如按源实例ID,自动选最新快照)
    • 填写目标实例的ID、实例类型、安全组等配置
    • 勾选“DeleteExistingInstance”选项,自动删除旧报表实例
  4. 完成配置后,可以直接执行测试,也可以在页面中设置计划执行,指定每日运行时间

几个关键注意事项

  • 兼容配置:目标实例的DB引擎版本、存储类型要和快照兼容,避免恢复失败
  • 连接稳定性:如果报表应用用固定端点连接,保持目标实例ID不变,恢复后端点会自动复用
  • 失败通知:可以给Lambda或Systems Manager配置SNS通知,执行成功/失败时自动发邮件或消息提醒
  • 测试验证:先手动执行一次流程,确认权限、配置都没问题再开定时

内容的提问来源于stack exchange,提问作者marcia12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:05:23