AWS S3 通过 CLI 脚本递归移除删除标记

Published: 2023-02-16

Tags: Shell

本文总阅读量

前置条件

  • 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.txttestfile-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

所有删除标记都已被移除,文件恢复如初

参考