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

如何通过AWS Lambda/CloudWatch自动删除旧EBS快照(仅留7天)

实现AWS EBS快照自动清理(保留最近7天)

嘿,我刚好搞定过类似的需求,用Lambda + EventBridge(原CloudWatch Events)就能完美实现自动删除旧快照,只留最近7天的备份。下面是一步步的实操指南,跟着做就行:

一、核心逻辑

写个Lambda函数遍历你的EBS快照,找出创建时间超过7天的删掉,再用EventBridge每天定时触发这个函数——和你现有的快照生成任务错开时间就不会冲突。

二、具体步骤

1. 创建Lambda函数

  • 登录AWS控制台,找到Lambda服务,点击「创建函数」
  • 选「从头开始创作」,给函数起个好记的名字比如Cleanup-Old-EBS-Snapshots,运行时选Python 3.x(比如3.11),直接点「创建函数」就行

2. 给Lambda配置权限

Lambda需要权限去查看和删除快照,所以得给它的执行角色加权限:

  • 进入Lambda函数的「配置」标签,选「权限」,点击执行角色的链接跳转到IAM控制台
  • 在IAM角色的「权限」页,点「添加权限」→「创建内联策略」
  • 切换到JSON编辑器,粘贴下面的策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSnapshots",
                "ec2:DeleteSnapshot"
            ],
            "Resource": "*"
        }
    ]
}
  • 给策略起个名比如EBS-Snapshot-Cleanup-Permissions,保存就搞定了

3. 编写Lambda清理代码

回到Lambda的「代码」标签,把默认代码换成下面的Python脚本:

import boto3
from datetime import datetime, timedelta, timezone

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')
    
    # 计算7天前的UTC时间(AWS所有时间用UTC,别搞错时区)
    cutoff_time = datetime.now(timezone.utc) - timedelta(days=7)
    
    # 获取自己账号下的所有快照(如果有需要,可以加过滤条件只处理自动备份的)
    response = ec2.describe_snapshots(OwnerIds=['self'])
    
    deleted_count = 0
    for snapshot in response['Snapshots']:
        snapshot_time = snapshot['StartTime']
        snapshot_id = snapshot['SnapshotId']
        
        # 判断快照是否超过7天
        if snapshot_time < cutoff_time:
            try:
                ec2.delete_snapshot(SnapshotId=snapshot_id)
                print(f"删掉旧快照啦:{snapshot_id},创建时间:{snapshot_time}")
                deleted_count += 1
            except Exception as e:
                print(f"删快照失败 {snapshot_id}:{str(e)}")
    
    print(f"清理完成!一共删了{deleted_count}个旧快照")
    return {
        'statusCode': 200,
        'body': f"Deleted {deleted_count} old snapshots"
    }

💡 重要提醒:如果你不想误删手动创建的快照,建议给自动生成的快照加统一标签(比如AutoBackup: Daily),然后修改上面的describe_snapshots代码,加上过滤条件:

response = ec2.describe_snapshots(
    OwnerIds=['self'],
    Filters=[
        {'Name': 'tag:AutoBackup', 'Values': ['Daily']}
    ]
)

这样就只会清理自动备份的快照,安全多了!

4. 设置定时触发(EventBridge)

  • 回到Lambda的「配置」标签,选「触发器」,点「添加触发器」
  • 触发器类型选「EventBridge(CloudWatch Events)」,然后选「创建新规则」
  • 规则名比如Daily-Snapshot-Cleanup,规则类型选「计划表达式」
  • 计划表达式填cron(0 1 * * ? *)——意思是UTC每天1点执行,你可以根据自己的快照生成时间调整(比如快照在UTC0点生成,那清理放1点就不会冲突)
  • 点「添加」就完成定时配置了

5. 测试一下

  • 在Lambda的「代码」标签,点「测试」,随便创建个测试事件(默认内容就行),然后点「测试」
  • 去「监控」标签→「日志」→「查看CloudWatch日志」看看执行情况,确认没有报错,能正常删快照就OK了

三、额外小建议

  • 标签管理要做好:给自动快照加统一标签,不仅方便清理,也能快速区分手动/自动备份
  • 权限尽量最小化:如果你的快照都和特定EC2实例绑定,可以在IAM策略里限制资源范围,不过一般用*也没问题,因为我们指定了OwnerIds=['self'],只会处理自己账号的快照
  • 加个告警:在CloudWatch里给Lambda的执行失败日志加个告警,万一出问题能及时收到通知

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:43:42