前置条件
- S3 Bucket 需已开启版本管理。
- 删除文件是通过 CLI 工具等方式删除,有 Delete marker 标记的。
安装 AWS CLI 工具
安装
$ pip3 install awscli
配置
$ aws configure
Access key:AKIA2AB******MTBXXDA
Secret access key:PSPlgrIahyy2qP9b********xMm8D+6DIayjDKzO
region:ap-northeast-1
确认能够访问的通 S3
$ aws s3 ls s3://dd-test-public/
PRE testdir/
模拟误删除
本地文件结构
多次上传 testfile-01.txt
和 testfile-02.txt
到 S3
从图像可以看到一个文件当前版本 + 历史版本总用有三个文件,现在删除掉当前版本。(重复删除了 testfile-01.txt)
$ aws s3api delete-object --bucket dd-test-public --key testdir/20230216/testfile-01.txt
$ aws s3api delete-object --bucket dd-test-public --key testdir/20230216/testfile-01.txt
$ aws s3api delete-object --bucket dd-test-public --key testdir/20230216/testfile-02.txt
此时状态如上,S3 面板上出现了三个删除标记,同时使用 cli 工具查看目录下文件,已不存在文件。
$ aws s3 ls s3://dd-test-public/testdir/20230216/
2023-02-15 21:32:04 0
脚本恢复
使用时,替换为自己的 bucket
和目录。
retrieve.sh
# 修改 bucketname 和目录,删除所有 “delete markers” 以恢复文件,
aws s3api list-object-versions --bucket dd-test-public --prefix testdir/ --output text |grep "DELETEMARKERS" | while read obj
do
KEY=$( echo $obj| awk '{print $3}')
VERSION_ID=$( echo $obj | awk '{print $5}')
echo $KEY
echo $VERSION_ID
aws s3api delete-object --bucket dd-test-public --key $KEY --version-id $VERSION_ID > /dev/null
done
输出
$ bash revocer.sh
testdir/20230216/testfile-01.txt
v.3rj8iVc2NcN4zblhmkWAWmtwVMaUf9
testdir/20230216/testfile-01.txt
vt67rGe5UC.9fenzqWTAy1TWKYzKL6lY
testdir/20230216/testfile-02.txt
y6FGHZqQFwGaeSTqb.IWmpShYIY1MHaO
所有删除标记都已被移除,文件恢复如初