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 在启用版本的amazon s3存储桶上还原文件_Amazon Web Services_Amazon S3 - Fatal编程技术网

Amazon web services 在启用版本的amazon s3存储桶上还原文件

Amazon web services 在启用版本的amazon s3存储桶上还原文件,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,我正在尝试在AmazonS3存储桶上启用版本控制和生命周期策略。我知道可以先启用版本控制,然后在该存储桶上应用生命周期策略。如果你看到下图,这将证实这个想法 然后我上传了一个文件多次,创建了同一文件的多个版本。然后我删除了文件,仍然可以看到几个版本。但是,如果尝试还原文件,我会看到Initiate restore选项变灰 我想问任何有类似问题的人,或者让我知道我做错了什么 谢谢,我意识到,一旦对象存储在Gliacer上,我就可以执行并启动恢复操作,如对象的存储类所示。要在S3上恢复以前的副本

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

然后我上传了一个文件多次,创建了同一文件的多个版本。然后我删除了文件,仍然可以看到几个版本。但是,如果尝试还原文件,我会看到Initiate restore选项变灰

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


谢谢,

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

Amazon S3上的Bucket版本控制保留对象的所有版本,即使它们被删除或在相同键(文件名)下上载新对象时也是如此

根据您的屏幕截图,该对象的所有以前版本仍然可用。通过选择所需版本并从“操作”菜单中选择“打开”,可以在S3管理控制台中下载/打开它们

如果选择了Versions:Hide,则每个对象只显示一次。其内容等于对象的最新上载版本

删除版本化存储桶中的对象只会创建一个删除标记作为最新版本。这会使对象看起来好像已被删除,但如果单击控制台顶部的版本:显示按钮,以前的版本仍然可见。删除删除标记将使对象重新出现,并且内容将是上载的最新版本(删除之前)

如果希望对象的特定版本为“当前”版本,请执行以下任一操作:

  • 删除该版本之后的所有版本(使所需版本成为最新版本),或
  • 将所需版本复制回同一对象(使用相同的键,即文件名)。这将添加新版本,但内容将与您复制的版本相同。复制可以在S3管理控制台中执行——只需从Actions菜单中选择copy,然后选择Paste

启动还原用于亚马逊冰川,这是一个档案存储系统。除非您已经创建了将对象移动到Glacier的生命周期策略,否则此选项不相关。

使用新控制台,您可以按照以下操作

  • 单击“已删除对象”按钮
  • 您将在下面看到已删除的对象,请选择它
  • 单击更多->撤消删除

  • 如果要还原大量已删除的文件。您可能需要使用脚本来完成这项工作

    剧本应该

  • 使用API获取bucket中对象的版本
  • 检查版本数据以获取删除标记(即删除对象)名称和版本id
  • 使用标记名和版本ID删除找到的标记
  • :

    此示例脚本一次一次删除找到的删除标记

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

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

    下面的示例脚本使用前缀搜索对象,并测试它们是否已被删除(即当前版本是删除标记),以及它们是否被批量删除。它设置为在每个批次中搜索bucket中的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')
    
    选择文件版本时,“操作”菜单中的“复制和粘贴”菜单项不可用(在版本:显示模式下)。选择文件(当前版本)时,这些菜单项仅在“版本:隐藏”模式下可用。因此,如果我没有遗漏任何内容,那么您恢复以前版本的第二个选项将不起作用。我认为唯一的另一种方法是下载你想要恢复的版本,然后重新上传(对于大文件来说这是非常愚蠢和低效的)。啊!完全正确!是,控制台中的复制和粘贴在版本化文件上不可用。相反,通过API或指定版本id作为
    复制源的一部分来复制对象。见:和。