在启用版本的amazon s3存储桶上恢复文件

时间:2015-01-16 12:05:21

标签: amazon-web-services amazon-s3

我正在尝试在我的Amazon S3存储桶上启用版本控制和生命周期策略。我知道可以先启用版本控制,然后在该存储桶上应用LifeCycle策略。如果你看到下面的图片,那将证实这个想法。

enter image description here

然后我多次上传了一个文件,创建了同一文件的多个版本。然后我删除了该文件,仍然可以看到几个版本。但是,如果我尝试还原文件,我会看到“启动还原”选项显示为灰色。

enter image description here

我想问任何有类似问题的人,或者让我知道我做错了什么。

谢谢,

3 个答案:

答案 0 :(得分:2)

使用新控制台,您可以按照以下方式执行此操作。

  1. 单击“删除的对象”按钮
  2. 您将在下方看到已删除的对象,选择它
  3. 点击更多 - >撤消删除
  4. enter image description here

答案 1 :(得分:1)

如果要恢复大量已删除的文件。您可能希望使用脚本为您完成工作。

脚本应该

  1. 使用Get object versions API
  2. 获取存储桶中的对象版本
  3. 检查版本数据以获取删除标记(即删除对象)名称和版本ID
  4. 使用Delete object API
  5. 删除使用标记名称和版本ID找到的标记

    Python example with boto

    此示例脚本逐个删除逐个找到的删除标记。

    #!/usr/bin/env python
    import boto
    
    BUCKET_NAME = "examplebucket"
    DELETE_DATE = "2015-06-08"
    
    bucket = boto.connect_s3().get_bucket(BUCKET_NAME)
    
    for v in bucket.list_versions():
        if (isinstance(v, boto.s3.deletemarker.DeleteMarker) and
                v.is_latest and
                DELETE_DATE in v.last_modified):
            bucket.delete_key(v.name, version_id=v.version_id)
    

    Python example with boto3

    但是,如果您有数千个对象,这可能是一个缓慢的过程。 AWS确实为batch delete objects提供了最大批量大小为1000的方法。

    以下示例脚本使用前缀搜索对象,并在删除它们时测试它们(即当前版本是删除标记)并批量删除它们。它被设置为在每个批次中搜索存储桶中的500个对象,并尝试删除多个对象,批次不超过1000个对象。

    import boto3
    
    client = boto3.client('s3')
    
    
    def get_object_versions(bucket, prefix, max_key, key_marker):
        kwargs = dict(
            Bucket=bucket,
            EncodingType='url',
            MaxKeys=max_key,
            Prefix=prefix
        )
    
        if key_marker:
            kwargs['KeyMarker'] = key_marker
    
        response = client.list_object_versions(**kwargs)
    
        return response
    
    
    def get_delete_markers_info(bucket, prefix, key_marker):
        markers = []
        max_markers = 500
        version_batch_size = 500
    
        while True:
            response = get_object_versions(bucket, prefix, version_batch_size, key_marker)
            key_marker = response.get('NextKeyMarker')
            delete_markers = response.get('DeleteMarkers', [])
    
            markers = markers + [dict(Key=x.get('Key'), VersionId=x.get('VersionId')) for x in delete_markers if
                                 x.get('IsLatest')]
    
            print '{0} -- {1} delete markers ...'.format(key_marker, len(markers))
    
            if len(markers) >= max_markers or key_marker is None:
                break
    
        return {"delete_markers": markers, "key_marker": key_marker}
    
    
    def delete_delete_markers(bucket, prefix):
        key_marker = None
    
        while True:
            info = get_delete_markers_info(bucket, prefix, key_marker)
            key_marker = info.get('key_marker')
            delete_markers = info.get('delete_markers', [])
    
            if len(delete_markers) > 0:
                response = client.delete_objects(
                    Bucket=bucket,
                    Delete={
                        'Objects': delete_markers,
                        'Quiet': True
                    }
                )
    
                print 'Deleting {0} delete markers ... '.format(len(delete_markers))
                print 'Done with status {0}'.format(response.get('ResponseMetadata', {}).get('HTTPStatusCode'))
            else:
                print 'No more delete markers found\n'
                break
    
    
    delete_delete_markers(bucket='data-global', prefix='2017/02/18')
    

答案 2 :(得分:0)

我已经意识到,一旦对象存储在Gliacer上,我就可以执行并启动还原操作,如对象的存储类所示。要在S3上恢复以前的副本,必须删除当前对象上的删除标记。