还原早期版本 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

还原早期版本

您可以使用版本控制来检索对象的早期版本。有两种方法可执行该操作:

  • 将对象的早期版本复制到同一存储桶中。

    复制的对象将成为该对象的当前版本,且所有对象版本都保留。

  • 永久删除对象的当前版本。

    当您删除当前对象版本时,实际上会将先前版本转换为该对象的当前版本。

由于所有对象版本都保留,所以您可以通过将对象的特定版本复制到同一存储桶,使任何较早版本成为当前版本。在下图中,源对象(ID = 111111)已复制到同一存储桶中。Amazon S3 将提供一个新 ID (88778877),且它将成为该对象的当前版本。因此,该存储桶同时具有原始对象版本(111111)及其副本(88778877)。有关获取先前版本,然后将其上传以使其成为当前版本的更多信息,请参阅从启用了版本控制的存储桶中检索对象版本上传对象

随后,GET 将检索版本 88778877。

下图显示了如何删除对象的当前版本 (121212),该操作保留早期版本 (111111) 作为当前版本。有关删除对象的更多信息,请参阅删除单个对象

随后,GET 将检索版本 111111。

注意

要批量还原对象版本,可以使用 CopyObject 操作CopyObject 操作会复制清单中指定的每个对象。但请注意,不必以对象在清单中出现的相同顺序复制这些对象。对于受版本控制的存储桶,如果保留当前/非当前版本顺序很重要,您应首先复制所有非当前版本。然后,在第一个任务完成后,在后续任务中复制当前版本。

还原以前的对象版本

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 存储桶列表中,请选择包含对象的存储桶的名称。

  3. Objects(对象)列表中,请选择对象的名称。

  4. 请选择 Versions(版本)。

    Amazon S3 显示了对象的所有版本。

  5. 选中要检索的版本的 Version ID(版本 ID)旁的复选框。

  6. 依次选择 Actions(操作)、Download(下载),然后保存对象。

您也可以在对象概述面板中查看、下载和删除对象版本。有关更多信息,请参阅 在 Amazon S3 控制台中查看对象概述

重要

仅当对象已作为最新 (当前) 版本删除时,您才能取消删除它。您无法取消删除已删除对象的早期版本。有关更多信息,请参阅 在 S3 存储桶中使用版本控制

有关使用其他 Amazon SDK 的信息,请参阅 Amazon 开发人员中心

Python

以下 Python 代码示例通过删除指定回滚版本之后的所有版本,来还原版本控制对象的以前版本。

def rollback_object(bucket, object_key, version_id): """ Rolls back an object to an earlier version by deleting all versions that occurred after the specified rollback version. Usage is shown in the usage_demo_single_object function at the end of this module. :param bucket: The bucket that holds the object to roll back. :param object_key: The object to roll back. :param version_id: The version ID to roll back to. """ # Versions must be sorted by last_modified date because delete markers are # at the end of the list even when they are interspersed in time. versions = sorted( bucket.object_versions.filter(Prefix=object_key), key=attrgetter("last_modified"), reverse=True, ) logger.debug( "Got versions:\n%s", "\n".join( [ f"\t{version.version_id}, last modified {version.last_modified}" for version in versions ] ), ) if version_id in [ver.version_id for ver in versions]: print(f"Rolling back to version {version_id}") for version in versions: if version.version_id != version_id: version.delete() print(f"Deleted version {version.version_id}") else: break print(f"Active version is now {bucket.Object(object_key).version_id}") else: raise KeyError( f"{version_id} was not found in the list of versions for " f"{object_key}." )