如何在同步S3存储桶到本地时删除已迁移到Glacier的本地文件
解决方案1:直接修改现有sync命令(推荐)
你可以给aws s3 sync新增--exclude-storage-classes参数,将所有归档类型的存储类排除在同步清单之外,此时sync命令会把这些归档文件判定为S3端已删除,配合原有的--delete参数就会自动删除本地对应的文件。
修改后的命令如下:
LOCAL_DATA_PATH=~/Data/my/local/data/path S3_BUCKET_PATH=s3://my-data-bucket/and/path aws s3 sync --delete \ --exclude "*_ignore-me_*" \ --exclude-storage-classes GLACIER GLACIER_IR DEEP_ARCHIVE \ $S3_BUCKET_PATH $LOCAL_DATA_PATH
该参数支持同时排除多个存储类,上面的示例已经覆盖了S3所有归档类型的存储类,你可以根据自己实际用到的归档类型调整。
解决方案2:新增独立的归档文件清理步骤
如果你不想修改原有同步逻辑,也可以单独加一段脚本,先拉取S3桶内所有已归档文件的路径,再批量删除本地对应的文件:
LOCAL_DATA_PATH=~/Data/my/local/data/path S3_BUCKET_NAME=my-data-bucket S3_PREFIX=and/path/ # 拉取所有归档类文件的key,输出到临时清单 aws s3api list-objects-v2 \ --bucket $S3_BUCKET_NAME \ --prefix $S3_PREFIX \ --query "Contents[?StorageClass=='GLACIER' || StorageClass=='DEEP_ARCHIVE' || StorageClass=='GLACIER_IR'].Key" \ --output text | tr '\t' '\n' > /tmp/glacier_files.txt # 循环删除本地对应的文件 while read s3_key; do # 拼接本地文件路径,注意去掉S3前缀的部分 local_file="${LOCAL_DATA_PATH}/${s3_key#$S3_PREFIX}" if [ -f "$local_file" ]; then rm -f "$local_file" fi done < /tmp/glacier_files.txt # 清理临时文件 rm -f /tmp/glacier_files.txt
你可以把这段脚本加到原有cron任务的同步逻辑之前或者之后运行即可。
注意事项
- 首次修改命令前建议先加上
--dryrun参数试运行,确认输出的删除文件列表符合预期后再正式执行,避免误删。 --exclude-storage-classes是AWS CLI v2的新增参数,如果你还在使用CLI v1版本,建议升级到最新版CLI,或者直接使用第二种清理方案。- 如果你的部分归档文件有临时恢复的需求,需要保留本地已恢复的文件,可以在第二种方案的查询逻辑中额外增加
Restore字段的判断,过滤掉已经完成恢复的文件即可。
内容的提问来源于stack exchange,提问作者medley56
相关产品推荐
相关产品推荐

