从Amazon S3恢复已删除的对象

时间:2015-07-28 13:59:25

标签: amazon-web-services amazon-s3

我有一个存储桶(启用了版本),如何找回从我的存储桶中意外永久删除的对象。

5 个答案:

答案 0 :(得分:2)

使用存储桶版本控制可以永久删除对象,您需要特别提及对象的版本DELETE Object versionId 如果您已完成此操作,则无法恢复此特定版本,则可以访问以前的版本

启用版本控制时,简单的DELETE无法永久删除对象。相反,Amazon S3会在存储桶中插入删除标记,以便您可以从此特定标记恢复,但如果标记已删除(并且您提及它已永久删除)则无法恢复

您启用了跨区域复制吗?如果是这样,您可以检索其他区域中的对象:

如果DELETE请求指定要删除的特定对象版本ID,Amazon S3将删除源存储桶中的该对象版本,但它不会复制目标存储桶中的删除(换句话说,它不会删除来自目标存储桶的对象版本)。此行为可保护数据免遭恶意删除。

修改:如果您在广告连播中启用了版本控制,则应该获得Versions Hide/Show切换按钮,当选择Show时,您应该拥有额外的Version ID根据我的桶中的屏幕截图列 S3 Management Console

答案 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 个脚本来过滤以某个字母/数字开头的文件。至少通过这种方式,您可以开始处理存储桶中更深层次的文件。