跳至内容

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

2 分钟阅读
0

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

简短描述

**注意:**S3 版本控制仅适用于通用存储桶。目录和表存储桶不支持 S3 版本控制。

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

要检索从启用了版本控制的存储桶中删除的对象,请执行以下操作之一:

  • 下载该对象的先前版本。您必须拥有 s3:GetObjectVersion 权限。
  • 使用具备 s3:DeleteObjectVersion 权限的 AWS 账户移除删除标记。然后,最新的未删除版本将成为该对象的当前版本,这样您就可以在启用了版本控制的存储桶中访问先前删除的对象。
  • **注意:**如果您在存储桶上配置了多重身份验证 (MFA) 删除功能,则必须使用 MFA 删除功能来移除删除标记。

解决方法

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

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

完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 在导航窗格中,选择 Buckets(存储桶),然后选择已删除对象所在的存储桶。
  3. 要查看对象的版本列表,请打开 Show versions(显示版本)。
  4. 选择要检索的已删除对象的版本。
  5. 选择 Actions(操作),然后选择 Download(下载)。

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

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。在以下命令中,请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶的名称。

完成以下步骤:

  1. 运行 list-object-versions 命令以列出对象版本:

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

    **注意:**上述命令包含 --prefix 选项,用于将结果筛选为指定的键名称前缀。当您的存储桶包含许多对象版本时,使用此选项可减少结果数量。

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

  3. 运行 get-object 命令以检索该版本:

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

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

完成以下步骤:

  1. 从拥有已删除对象存储桶的账户中打开 Amazon S3 控制台
  2. 在导航窗格中,选择 Buckets(存储桶),然后选择已删除对象所在的存储桶。
  3. 要查看对象的版本列表,请打开 Show versions(显示版本)。
  4. 选择对象的删除标记
    **重要事项:**确保选择删除标记,而非对象本身。否则,将无法检索该对象。
  5. Delete objects(删除对象)页面上,对于 Permanently delete objects?(永久删除对象?),输入 permanently delete(永久删除)。
  6. 选择 Delete(删除)。
    **重要事项:**您无法使用 Amazon S3 控制台来撤消删除文件夹。相反,必须使用 AWS CLI 或 AWS SDK。

使用 AWS CLI 移除删除标记

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

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

完成以下步骤:

  1. 运行以下带 --query 参数的 list-object-versions 命令:

    aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --query 'DeleteMarkers[*].{Key: Key, VersionId: VersionId}'

    **注意:**上述命令包含 --prefix 选项,用于将结果筛选为指定的键名称前缀。

  2. 从命令输出中,记下删除标记的版本 ID。
    **重要事项:**请务必记下删除标记的版本 ID。如果删除某个对象版本,将无法再检索该对象。

  3. 运行 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

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

**警告:**在运行以下 list-object-versions 命令之前,最佳做法是备份数据。此命令使用 s3api delete-object API 操作来删除删除标记所标识的对象。删除对象是一项永久性操作。修改此命令结构可能会导致意外的数据丢失。

完成以下步骤:

  1. 打开 AWS CloudShell 控制台。
  2. 运行 list-object-versions 命令:
    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
    **注意:**上述命令使用 jq 工具来解析当前版本 DeleteMarkersListObjectVersions 响应。默认情况下,AWS CloudShell 上安装有 jq。如果您不与 Shell 环境进行交互,则 Shell 会话将结束。有关 jq 工具的详细信息,请参阅 jq 网站上的 ./jq

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

要移除存储桶中数百万个对象上的删除标记,请在 AWS SDK 中使用自定义脚本。有关详细信息,请展开 Using the AWS SDKs(使用 AWS SDK)选项卡。

**注意:**当您在包含数百万个对象的存储桶上运行 list-object-versions 时,可能会出现超时。

AWS 官方已更新 6 个月前