Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 从AmazonS3恢复删除的对象_Amazon Web Services_Amazon S3 - Fatal编程技术网

Amazon web services 从AmazonS3恢复删除的对象

Amazon web services 从AmazonS3恢复删除的对象,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,我有一个bucket(已启用版本),如何才能从我的bucket中取回意外永久删除的对象 使用bucket versioning可永久删除对象,您需要特别提及对象的版本删除对象版本ID 如果已经恢复,则无法恢复此特定版本,则可以访问以前的版本 启用版本控制后,简单删除无法永久删除对象。相反,amazons3在bucket中插入一个delete标记,这样您就可以从这个特定的标记中恢复,但是如果该标记被删除(并且您提到它是永久删除的),您就无法恢复 您是否启用了跨区域复制?如果是,则可以在其他区域中检

我有一个bucket(已启用版本),如何才能从我的bucket中取回意外永久删除的对象

使用bucket versioning可永久删除对象,您需要特别提及对象的版本
删除对象版本ID
如果已经恢复,则无法恢复此特定版本,则可以访问以前的版本

启用版本控制后,简单删除无法永久删除对象。相反,amazons3在bucket中插入一个delete标记,这样您就可以从这个特定的标记中恢复,但是如果该标记被删除(并且您提到它是永久删除的),您就无法恢复

您是否启用了跨区域复制?如果是,则可以在其他区域中检索对象:

如果删除请求指定要删除的特定对象版本ID,Amazon S3将删除源bucket中的该对象版本,但不会在目标bucket中复制删除操作(换句话说,它不会从目标bucket中删除相同的对象版本)。此行为可防止恶意删除数据

编辑:如果您在存储桶上启用了版本控制,您应该获得
版本隐藏/显示
切换按钮,并且当选择
显示
时,您应该根据我的存储桶的屏幕截图拥有额外的
版本ID

我创建了一个脚本,用deletemarker恢复对象。您必须按如下方式输入:

sh Undelete_deletemarker.sh bucketname路径/到/特定/文件夹

**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

快乐编码!;)

谢谢你,Kc Bickey,这个脚本非常棒!我唯一可以为其他人添加的是确保第12行的“$VERSION\u 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

如果bucket对象的文件名中有空格,则以前的脚本可能无法正常工作。此脚本使用包含空格的键

#!/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

这个版本的脚本对我来说非常有效。我有一个bucket,它有一个包含180000个项目的目录,这个bucket会仔细检查并恢复bucket中目录/文件夹中的所有文件

如果您只需要恢复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

}

请注意,将运行此脚本两次,但它不会工作。它只会在第二个脚本中返回相同的记录,因此它实际上什么都不做。如果您有一个巨大的bucket,我可能会设置3-4个脚本,通过以特定字母/数字开头的文件进行过滤。至少通过这种方式,您可以开始处理存储桶中更深层次的文件。

谢谢您的回复,您可以告诉我如何通过控制台登录或.net SDKI中是否有任何代码。如果您启用了跨区域复制,您必须选择一个目标存储桶,因此如果您浏览此存储桶并显示所有版本的文件,您应该能够检索您的文件。我已在跨区域复制存储桶中更新了一个对象,然后该对象也在目标存储桶中得到更新,在哪里可以得到该对象的旧版本,我没有显示所有版本的选项。grep命令也会出现同样的情况。应该在前一行!我唯一应该添加到这个脚本的是,它只适用于只有一个删除版本的项目。我可能应该调整它,只得到最新的删除标记,这应该是一个简单的修复。哦,这运行约1记录每秒。所以,每小时有3600张唱片。