云存储成本优化:阿里云 OSS 删除历史版本与碎片文件的自动化脚本
·
云存储成本优化:阿里云 OSS 删除历史版本与碎片文件的自动化脚本
在阿里云对象存储服务(OSS)中,启用版本控制后,对象的每次修改都会创建历史版本,这些旧版本可能占用大量存储空间,导致成本上升。类似地,分片上传过程中产生的碎片文件(如未完成的上传)也会浪费资源。通过自动化删除这些内容,可以有效降低存储费用。例如,存储成本公式为:$ \text{月成本} = \text{存储量(GB)} \times \text{单价(元/GB)} $,删除冗余数据能直接减少存储量。
以下是一个基于 Python 的自动化脚本,使用阿里云 OSS SDK 实现历史版本和碎片文件的删除。该脚本会:
- 删除指定天数前的历史版本(例如,保留最近 30 天的版本)。
- 清理所有碎片文件。
- 支持分页处理,适用于大规模存储桶。
脚本依赖
- 安装阿里云 OSS Python SDK:
pip install aliyun-python-sdk-core aliyun-python-sdk-oss2 - 需要阿里云 AccessKey ID 和 AccessKey Secret(从 RAM 控制台获取)。
- 确保 OSS 桶已启用版本控制(历史版本删除需要此设置)。
Python 自动化脚本
import oss2
from datetime import datetime, timedelta
# 配置阿里云认证信息
access_key_id = '您的AccessKey ID' # 替换为实际ID
access_key_secret = '您的AccessKey Secret' # 替换为实际Secret
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com' # 替换为您的OSS端点
bucket_name = '您的桶名称' # 替换为实际桶名
# 创建认证对象和桶对象
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
def delete_old_versions(days_threshold=30):
"""删除指定天数前的历史版本"""
# 计算截止日期
cutoff_date = datetime.now() - timedelta(days=days_threshold)
print(f"开始删除 {days_threshold} 天前的历史版本...")
# 列出所有对象版本(分页处理)
next_key_marker = ''
next_version_marker = ''
deleted_count = 0
while True:
result = bucket.list_object_versions(key_marker=next_key_marker, version_marker=next_version_marker)
for version in result.versions:
# 检查版本最后修改时间
last_modified = datetime.fromtimestamp(version.last_modified)
if last_modified < cutoff_date:
# 删除旧版本
bucket.delete_object(version.key, version.versionid)
deleted_count += 1
print(f"已删除版本: {version.key} (ID: {version.versionid})")
# 更新分页标记
if result.is_truncated:
next_key_marker = result.next_key_marker
next_version_marker = result.next_version_marker
else:
break
print(f"历史版本删除完成。共删除 {deleted_count} 个版本。")
def delete_fragments():
"""删除所有碎片文件"""
print("开始删除碎片文件...")
fragments = bucket.list_multipart_uploads()
deleted_count = 0
for fragment in fragments.upload_list:
# 终止并删除碎片
bucket.abort_multipart_upload(fragment.key, fragment.upload_id)
deleted_count += 1
print(f"已删除碎片: {fragment.key} (ID: {fragment.upload_id})")
print(f"碎片文件删除完成。共删除 {deleted_count} 个碎片。")
if __name__ == '__main__':
# 执行删除操作(可调整参数,如保留天数)
delete_old_versions(days_threshold=30) # 默认保留最近30天版本
delete_fragments()
print("自动化清理完成!成本优化已生效。")
脚本使用说明
- 参数配置:
- 修改脚本中的
access_key_id、access_key_secret、endpoint和bucket_name为您的实际信息。 - 调整
days_threshold参数(默认为 30 天),根据需要设置历史版本保留策略。
- 修改脚本中的
- 运行脚本:
- 保存为
.py文件(如oss_cleanup.py)。 - 命令行执行:
python oss_cleanup.py。 - 脚本会输出删除详情,便于监控。
- 保存为
- 定时自动化:
- 结合 cron(Linux)或 Task Scheduler(Windows)设置定期运行(如每天凌晨)。
- 示例 cron 表达式:
0 2 * * * /usr/bin/python3 /path/to/oss_cleanup.py(表示每天凌晨 2 点运行)。
注意事项
- 安全第一:删除操作不可逆!建议先在测试桶运行,并备份重要数据。阿里云 OSS 提供“软删除”功能(如开启 WORM 规则),可减少误删风险。
- 成本影响:删除后,存储量会下降,但需注意 OSS 的计费周期(如按月结算)。优化后,成本节省可估算为:$ \Delta \text{成本} \approx \Delta \text{存储量} \times \text{单价} $。
- 性能优化:对于大型桶,脚本已处理分页;如果对象过多,可增加延迟或分批执行。
- 额外建议:
- 结合生命周期规则:在 OSS 控制台设置自动过期策略,减少脚本依赖。
- 监控成本:使用阿里云账单分析工具,跟踪优化效果。
通过此脚本,您可以自动化清理冗余数据,显著降低存储成本。如有问题,可参考阿里云官方文档或咨询支持。
更多推荐
所有评论(0)