我有一个存储桶(启用了版本),如何找回从我的存储桶中意外永久删除的对象。
答案 0 :(得分:2)
使用存储桶版本控制可以永久删除对象,您需要特别提及对象的版本DELETE Object versionId
如果您已完成此操作,则无法恢复此特定版本,则可以访问以前的版本
启用版本控制时,简单的DELETE无法永久删除对象。相反,Amazon S3会在存储桶中插入删除标记,以便您可以从此特定标记恢复,但如果标记已删除(并且您提及它已永久删除)则无法恢复
您启用了跨区域复制吗?如果是这样,您可以检索其他区域中的对象:
如果DELETE请求指定要删除的特定对象版本ID,Amazon S3将删除源存储桶中的该对象版本,但它不会复制目标存储桶中的删除(换句话说,它不会删除来自目标存储桶的对象版本)。此行为可保护数据免遭恶意删除。
修改:如果您在广告连播中启用了版本控制,则应该获得Versions Hide/Show
切换按钮,当选择Show
时,您应该拥有额外的Version ID
根据我的桶中的屏幕截图列
答案 1 :(得分:2)
我创建了一个用deletemarker恢复对象的脚本。你必须输入如下:
sh Undelete_deletemarker.sh bucketname path / to / certain / folder
**Script:**
#!/bin/bash
#please provide the bucketname and path to destination folder to restore
# Remove all versions and delete markers for each object
aws s3api list-object-versions --bucket $1 --prefix $2 --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 $1 --key $KEY --version-id
$VERSION_ID
done
快乐的编码! ;)
答案 2 :(得分:1)
谢谢您,Kc Bickey,这个脚本很棒!我可能要为其他人添加的唯一内容是确保在第12行的“ --version-id”之后紧跟着“ $ VERSION_ID”。论坛似乎将“ $ VERSION_ID”包装到了下一行,这会导致脚本出错,直到已经纠正。
**Script:**
#!/bin/bash
#please provide the bucketname and path to destination folder to restore
# Remove all versions and delete markers for each object
aws s3api list-object-versions --bucket $1 --prefix $2 --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 $1 --key $KEY --version-id $VERSION_ID
done
答案 3 :(得分:0)
如果存储桶对象的文件名中带有空格,则先前的脚本可能无法正常工作。该脚本使用包含空格的键。
#!/bin/bash
#please provide the bucketname and path to destination folder to restore
# Remove all versions and delete markers for each object
aws s3api list-object-versions --bucket $1 --prefix $2 --output text |
grep "DELETEMARKERS" | while read obj
do
KEY=$( echo $obj| awk '{indice=index($0,$(NF-1))-index($0,$3);print substr($0, index($0,$3), indice-1)}')
VERSION_ID=$( echo $obj | awk '{print $NF}')
echo $KEY
echo $VERSION_ID
aws s3api delete-object --bucket $1 --key "$KEY" --version-id $VERSION_ID
done
答案 4 :(得分:0)
这个版本的脚本非常适合我。我有一个存储桶,其中有一个包含 180,000 个项目的目录,这个存储桶会仔细阅读它们并恢复存储桶内目录/文件夹中的所有文件。
如果你只需要恢复一个bucket中没有目录的所有项目,那么你可以去掉prefix参数。
#!/bin/bash
BUCKET=mybucketname
DIRECTORY=myfoldername
function run() {
aws s3api list-object-versions --bucket ${BUCKET_NAME} --prefix="${DIRECTORY}" --query='{Objects: DeleteMarkers[].{Key:Key}}' --output text |
while read KEY
do
if [[ "$KEY" == "None" ]]; then
continue
else
KEY=$(echo ${KEY} | awk '{$1=""; print $0}' | sed "s/^ *//g")
VERSION=$(aws s3api list-object-versions --bucket ${BUCKET_NAME} --prefix="$KEY" --query='{Objects: DeleteMarkers[].{VersionId:VersionId}}' --output text | awk '{$1=""; print $0}' | sed "s/^ *//g")
echo ${KEY}
echo ${VERSION}
fi
aws s3api delete-object --bucket ${BUCKET_NAME} --key="${KEY}" --version-id ${VERSION}
done
}
请注意,运行此脚本两次会运行,但不起作用。它只会在第二个脚本中返回相同的记录,因此它实际上并没有做任何事情。如果你有一个巨大的存储桶,我可能会设置 3-4 个脚本来过滤以某个字母/数字开头的文件。至少通过这种方式,您可以开始处理存储桶中更深层次的文件。