如何检索启用版本控制的存储桶中已被删除的 Amazon S3 对象?

上次更新时间:2020 年 5 月 20 日

我想检索启用版本控制的 Amazon Simple Storage Service (Amazon S3) 存储桶中已被删除的某个对象。该如何操作?

简短描述

当您从启用版本控制的存储桶中删除某个对象时,Amazon S3 将为该对象创建一个删除标记。删除标记将成为该对象的当前版本,同时实际的对象将成为早期版本。Amazon S3 将通过删除标记来响应请求,尽管该对象已被删除。例如,如果您发送一个针对该对象的 GET 请求,Amazon S3 将会返回一条错误消息。

您可以通过下列方式来检索启动版本控制的存储桶中已被删除的对象:

  • 下载对象的早期版本:要下载对象的早期版本(实际对象),您必须具有 s3:GetObjectVersion 权限。
  • 移除删除标记:移除删除标记后,实际对象将成为该对象的当前版本。要移除删除标记,您必须具有 s3:DeleteObjectVersion 权限。此外,您必须使用拥有或创建该存储桶的 AWS 账户来移除删除标记。
    注意:如果存储桶已启用 MFA 删除,您必须使用指定的 Multi-Factor Authentication (MFA) 来移除删除标记。

解决方法

使用 Amazon S3 控制台下载对象的早期版本

1.    打开 Amazon S3 控制台

2.    从存储桶列表中,打开已删除对象所在的存储桶。

3.    导航至已删除对象所在的文件夹。

4.    对于版本,选择显示

5.    在搜索栏中输入已删除对象的名称。

6.    选择该对象的早期版本(实际对象,而非删除标记),然后选择下载

使用 AWS 命令行界面 (AWS CLI) 下载对象的早期版本

1.    在存储桶上运行 list-object-versions 命令:

提示:以下示例命令包含 --prefix 选项,此选项会根据指定的键名称前缀筛选结果。这可在您的存储桶包含大量对象版本时帮助减少返回的结果数量,从而节省时间。

aws s3api list-object-versions --bucket AWSDOC-EXAMPLE-BUCKET --prefix example.txt

2.    从命令输出中,复制该对象早期版本(实际对象而不是删除标记)的版本 ID。

3.    用您在上一步中复制的版本 ID 运行 get-object 命令:

aws s3api get-object --bucket AWSDOC-EXAMPLE-BUCKET --key example.txt --version-id example.d6tjAKF1iObKbEnNQkIMPjj

使用 Amazon S3 控制台移除删除标记

1.    从拥有或创建已删除对象所在存储桶的 AWS 账户打开 Amazon S3 控制台

2.    从存储桶列表中,打开已删除对象所在的存储桶。

3.    导航至已删除对象所在的文件夹。

4.    对于版本,选择显示

5.    在搜索栏中输入已删除对象的名称。

6.    选择该对象的删除标记。

警告:请仔细检查您的选择,确保选对删除标记。如果您删除了某个对象版本,您将无法检索到它。

7.    依次选择操作删除

8.    在删除对象对话框中,选择删除

使用 AWS CLI 移除删除标记

1.    使用 --query 参数运行 list-object-versions 命令:

提示:以下示例命令包含 --prefix 选项,此选项会根据指定的键名称前缀筛选结果。这可在您的存储桶包含大量删除标记时帮助减少返回的结果数量,从而节省时间。

aws s3api list-object-versions --bucket AWSDOC-EXAMPLE-BUCKET --prefix example.txt --query 'DeleteMarkers[?IsLatest==`true`]'

2.    此命令将会返回存储桶中已被删除的所有对象。从命令输出中,复制要检索的对象删除标记的版本 ID。

警告:请仔细检查版本 ID,确保选对删除标记的版本 ID。如果您删除了某个对象版本,您将无法检索到它。

3.    用您在上一步中复制的版本 ID 运行 delete-object 命令:

aws s3api delete-object --bucket AWSDOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'

4.    移除删除标记后,当您列出存储桶中的对象时将会返回实际对象。要验证这一点,您可以运行 ls 命令:

aws s3 ls s3://AWSDOC-EXAMPLE-BUCKET

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?