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

2 分钟阅读
0

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

简短描述

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

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

  • **下载对象的早期版本:**要下载对象的早期版本(实际对象),您必须具有 s3:GetObjectVersion 权限。
  • **移除删除标记:**移除删除标记后,实际对象将成为该对象的当前版本。要移除删除标记,您必须具有 s3:DeleteObjectVersion 权限。同样,您必须使用拥有或创建该存储桶的 AWS 账户来移除删除标记。
    **注意:**如果桶启用了 MFA 删除,则您必须使用指定的多重身份验证(MFA)以移除删除标记。

解决方法

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

1.    打开 Amazon S3 控制台

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

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

4.    打开 Show versions(显示版本)。

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

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

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

**注意:**如果在运行 AWS CLI 命令时收到错误信息,请确保您使用的是最新版本的 AWS CLI

1.    在存储桶上运行 list-object-versions 命令。请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

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

**注意:**此示例包含 --prefix 选项,用于根据指定的键名称前缀筛选结果。在您的桶包含大量对象版本时,此选项有助于减少返回的结果数量,并且节省时间。

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

3.    用您在上一步中复制的版本 ID 运行 get-object 命令。请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

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

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

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

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

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

4.    打开 Show versions(显示版本)。

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

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

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

7.    选择 Delete(删除)。

8.    在 Delete objects(删除对象)页面中,确认列出了正确的删除标记。然后,输入 permanently delete 以确认删除。

9.    选择 Delete objects(删除对象)。

**重要提示:**您无法使用 Amazon S3 控制台取消删除文件夹。为此,您必须使用 AWS CLI 或 AWS 开发工具包。

使用 AWS CLI 移除删除标记

移除多个对象上的删除标记

1.    使用 --query 参数运行 list-object-versions 命令。请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

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

**注意:**以下示例命令包含 --prefix 选项,此选项会根据指定的键名称前缀筛选结果。如果您的存储桶包含大量对象版本,此选项有助于减少返回的结果数量,并且节省时间。

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

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

3.    用您在上一步中复制的版本 ID 运行 delete-object 命令。请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

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

4.    移除删除标记后,当您列出存储桶中的对象时将会返回实际对象。要验证删除标记是否已移除,请运行 ls 命令。请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

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

移除数千个对象上的删除标记

1.    导航到 AWS CloudShell

2.    运行以下 AWS CLI 命令:请将 DOC-EXAMPLE-BUCKET 替换为您的桶名称。

aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --output json --query 'DeleteMarkers[?IsLatest==`true`].[Key, VersionId]' | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]' | xargs -L1 aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET

**注意:**此示例使用来自 GitHub的 JQ 工具解析当前版本 DeleteMarkersListObjectVersions 响应。您可以根据您的特定用例对此自定义脚本示例进行更改。默认情况下,JQ 安装在 AWS CloudShell 上。如果未与 shell 环境交互,您的 shell 会话将结束。

移除数百万个对象上的删除标记

如果您的桶有数百万个对象,则执行 LIST 调用可能占用大量资源,从而导致超时。因此,请考虑将自定义脚本与 AWS 开发工具包结合使用。


相关视频

AWS 官方
AWS 官方已更新 2 年前