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

2 分钟阅读
0

我想检索从开启版本控制的 Amazon Simple Storage Service (Amazon S3) 存储桶中删除的对象。

简短描述

当您从启用版本的存储桶中删除对象时,Amazon S3 会为该对象创建删除标记。删除标记会成为对象的当前版本,而对象会成为先前版本。有了删除标记,Amazon S3 在响应对象的请求时就会像对象已被删除一样。例如,如果您向对象发送 GET 请求,Amazon S3 会返回错误。

要检索已经从启用版本的存储桶中删除的对象,请完成以下任务之一:

  • 下载该对象的先前版本: 要下载该对象的先前版本,您必须拥有 s3:GetObjectVersion 权限。
  • 移除删除标记: 移除删除标记后,原始对象会成为该对象的当前版本。要移除删除标记,您必须拥有 s3:DeleteObjectVersion 权限。此外,您必须使用拥有或已经创建存储桶的 AWS 账户来移除删除标记
    **注意:**如果存储桶配置了 MFA 删除功能,则必须使用指定的多重身份验证(MFA)来移除删除标记。

解决方法

**重要事项:**从存储桶中永久删除和移除的数据无法恢复。

要恢复对象的先前版本,请完成以下任务。在每条命令中,将 DOC-EXAMPLE-BUCKET 替换为您的存储桶的名称。

使用 Amazon S3 控制台下载对象的先前版本

要使用 Amazon S3 控制台下载对象的先前版本,请完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 从存储桶列表中,打开已删除对象的存储桶。
  3. 导航到已删除对象的文件夹。
  4. 打开显示版本
  5. 在搜索栏中,输入已删除对象的名称。
  6. 选择对象的先前版本。不要选择删除标记。
  7. 选择操作,然后选择下载

使用 AWS CLI 下载对象的先前版本

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

要使用 AWS CLI 下载对象的先前版本,请完成以下步骤:

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

    aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/

    **注意:**前面的命令示例包含 --prefix 选项,用于将结果筛选为指定的密钥名称前缀。当您的存储桶包含大量对象版本时,此选项有助于减少结果数量并节省时间。

  2. 从命令输出中,复制对象先前版本的版本 ID。

  3. 对版本 ID 运行 get-object 命令:

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

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

要使用 Amazon S3 控制台删除标记,请完成以下步骤:

  1. 从拥有已删除对象存储桶的账户中打开 Amazon S3 控制台
  2. 从存储桶列表中,打开已删除对象的存储桶。
  3. 导航到已删除对象的文件夹。
  4. 打开显示版本
  5. 在搜索栏中,输入已删除对象的名称。
  6. 选择对象的删除标记。
    **重要事项:**确保选择了删除标记。如果删除了某个对象版本,则无法再检索该对象。
  7. 选择删除
  8. 删除对象页面中,确认列出的删除标记正确。然后,输入永久删除以确认删除。
  9. 选择删除对象
    **重要事项:**您无法使用 Amazon S3 控制台来撤消删除文件夹。相反,必须使用 AWS CLI 或 AWS SDK。

使用 AWS CLI 移除删除标记

您可以使用 AWS CLI 移除多个对象、数千个对象或数百万个对象上的删除标记。

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

要移除多个对象上的删除标记,请完成以下步骤:

  1. 运行带有以下 --query 参数的 list-object-versions 命令:
    **注意:**前面的命令示例包含 --prefix 选项,用于将结果筛选为指定的密钥名称前缀。

  2. 从命令输出中,复制删除标记的版本 ID。
    **重要事项:**确保复制了删除标记的版本 ID。如果删除了某个对象版本,则无法再检索该对象。

  3. 对版本 ID 运行 delete-object 命令:

    aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'
  4. 要验证删除标记是否已移除,请运行 ls 命令:

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

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

要移除数千个对象上的删除标记,请完成以下步骤:

  1. 打开 AWS CloudShell 控制台。
  2. 运行 list-object-versions 命令:
    **警告:**最佳做法是在运行以下命令之前备份数据。此命令使用 s3api delete-object API 操作来删除命令元素标识的标记对象。删除对象是一项永久性操作,无法恢复。修改此命令结构可能会导致意外的数据丢失。
    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 -t aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET
    **注意:**前面的命令示例使用 GitHub 网站的 jq 工具来解析当前版本 DeleteMarkersListObjectVersions 响应。默认情况下,AWS CloudShell 上安装有 jq。如果您不与 shell 环境进行交互,则 shell 会话将结束。

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

要移除存储桶中数百万个对象上的删除标记,请在 AWS SDK 中使用自定义脚本。有关更多信息,请参阅移除删除标记的使用 AWS SDK 部分,使旧版本成为当前版本

**注意:**对有数百万个对象的存储桶执行 LIST 调用可能会费用高昂并导致超时。

AWS 官方
AWS 官方已更新 1 个月前