如何通过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
相关产品推荐
相关产品推荐

