如何在Amazon S3中删除7天前文件,且保留近6个月每月1日的备份?
Amazon S3数据库备份生命周期规则配置(满足7天清理+每月1日保留6个月需求)
需求回顾
- 每日生成格式为
db_dumpYYYYMMDDHHMMSS.gz的数据库转储文件并上传至S3 - 自动删除存储超过7天的普通备份
- 保留近6个月内每月1日生成的备份文件
推荐方案:S3原生生命周期规则(无需额外脚本)
直接利用S3的生命周期规则就能实现,配置两个互补的规则即可:
规则1:保留每月1日的备份6个月
- 进入S3存储桶的「管理」标签,点击「创建生命周期规则」
- 规则名称:
Retain-Monthly-First-Backups - 适用对象:选择「前缀匹配」,输入
db_dump??????01(匹配所有每月1日生成的备份,比如db_dump20240501xxxxxx.gz) - 配置过期:勾选「在对象创建后」,输入
180天(约6个月),设置过期删除 - 优先级:设为
1(较高优先级,确保先执行保留逻辑)
规则2:清理7天以上的非保留备份
- 再次创建生命周期规则
- 规则名称:
Cleanup-Old-Daily-Backups - 适用对象:选择「前缀匹配」,输入
db_dump,然后添加「排除前缀」db_dump??????01(避免删除每月1日的备份) - 配置过期:勾选「在对象创建后」,输入
7天,设置过期删除 - 优先级:设为
2(较低优先级,让保留规则先生效)
验证逻辑
- 普通备份(如
db_dump20240520120000.gz):7天后被规则2自动删除 - 每月1日备份(如
db_dump20240501090000.gz):会被规则1保留180天,之后自动删除
备选方案:AWS CLI脚本(自定义场景)
如果需要更灵活的控制(比如结合其他条件),可以用以下脚本配合CloudWatch Events定时执行:
#!/bin/bash BUCKET="your-bucket-name" PREFIX="db_dumps/" # 计算时间阈值 SEVEN_DAYS_AGO=$(date -d "-7 days" +%Y%m%d) SIX_MONTHS_AGO=$(date -d "-6 months" +%Y%m%d) # 遍历备份文件 aws s3 ls "s3://${BUCKET}/${PREFIX}" --recursive | while read -r line; do FILE_NAME=$(echo "$line" | awk '{print $4}') # 从文件名提取备份日期(YYYYMMDD) BACKUP_DATE=$(echo "$FILE_NAME" | sed -n 's/db_dump\([0-9]\{8\}\).*/\1/p') if [[ -z "$BACKUP_DATE" ]]; then continue fi # 判断是否为每月1日的备份 if echo "$BACKUP_DATE" | grep -q "01$"; then # 超过6个月则删除 if [[ "$BACKUP_DATE" < "$SIX_MONTHS_AGO" ]]; then aws s3 rm "s3://${BUCKET}/${FILE_NAME}" fi else # 超过7天则删除 if [[ "$BACKUP_DATE" < "$SEVEN_DAYS_AGO" ]]; then aws s3 rm "s3://${BUCKET}/${FILE_NAME}" fi fi done
- 替换
your-bucket-name和PREFIX为实际值 - 确保执行脚本的IAM角色拥有
s3:ListBucket和s3:DeleteObject权限
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

