如何使用 AWS CLI 从 S3 Glacier 或 S3 Glacier Deep Archive 存储类还原 Amazon S3 对象?

上次更新日期:2021 年 11 月 18 日

我使用生命周期配置将 Amazon Simple Storage Service (Amazon S3) 对象存储在了 S3 Glacier 或 Glacier Deep Archive 存储类中。如何使用 AWS 命令行界面 (AWS CLI) 还原该对象?

解决方案

如要使用 AWS CLI 从 Amazon S3 Glacier 或 S3 Glacier Deep Archive 存储类还原 S3 对象,请遵循下列步骤:

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

启动还原请求

运行以下命令以启动还原请求。请务必将示例命令中的所有值替换为您的存储桶、对象和还原请求的值。

注意:由于数据检索费用基于请求的数量,因此,请务必确认还原请求中的参数正确无误。

$ aws s3api restore-object --bucket awsexamplebucket --key dir1/example.obj --restore-request '{"Days":25,"GlacierJobParameters":{"Tier":"Standard"}}'

运行此命令后,该对象的临时副本将可在还原请求中指定的期限内可用。在此示例中,还原级别设置为 S3 Standard 时,还原请求中指定的持续时间为 25 天。

请注意您可以对该命令作出如下修改:

  • 如要还原版本控制存储桶中的特定对象版本,请添加 --version-id 选项,然后指定相应的版本 ID。
  • 对于 S3 Glacier 存储类,您可以使用“加快”、“标准”或“批量”检索选项。但是,对于 S3 Glacier Deep Archive 存储类,您只能使用“标准”或“批量”检索选项。
  • 如果示例中使用的 JSON 句法导致 Windows 客户端错误,则使用如下句法替换还原请求:
--restore-request Days=25,GlacierJobParameters={"Tier"="Standard"}

监控还原请求的状态

运行以下命令以监控还原请求的状态:

aws s3api head-object --bucket awsexamplebucket --key dir1/example.obj

运行命令后,如果还原仍在进行中,您会收到类似于以下内容的应答:

{
    "Restore": "ongoing-request=\"true\"",
    ...
    "StorageClass": "GLACIER | DEEP_ARCHIVE",
    "Metadata": {}
}

还原完成后,您会收到类似于以下内容的回应:

{
    "Restore": "ongoing-request=\"false\", expiry-date=\"Sun, 13 Aug 2017 00:00:00 GMT\"",
    ...
    "StorageClass": "GLACIER | DEEP_ARCHIVE",
    "Metadata": {}
}

请注意回应中的到期日期 — 在此时间之前,您一直拥有对临时存储对象(存储在“减少的冗余”存储类中的对象)的访问权限。临时对象,以及位于 S3 Glacier 或 S3 Glacier Deep Archive 存储类中的已存档对象,都可供访问。到期日期结束后,临时对象将被删除。您必须更改临时对象的存储类,临时对象才能过期。要在到期日期之后更改临时对象的存储类,您必须发出一个新还原请求。

将对象的存储类更改为 Amazon S3 Standard

要将对象的存储类更改为 Amazon S3 Standard,请使用复制(通过覆盖现有对象,或者将该对象复制到其他位置)。

警告:如果您使用的是 AWS CLI 1.x 版本,请确保在复制对象之前将多部分阈值设置为 5GB。否则,当对象大小大于 AWS CLI 的多部分阈值时,对象的用户元数据将丢失。对于大于 5GB 的对象,请使用 AWS CLI 的 2.x 版本以保留用户元数据。

(可选)要增加 AWS CLI 的多部分阈值,请运行以下命令:

aws configure set default.s3.multipart_threshold 5GB

如要使用 Amazon S3 Standard 存储类覆盖现有对象,请运行以下命令:

aws s3 cp s3://awsexamplebucket/dir1/example.obj s3://awsexamplebucket/dir1/example.obj --storage-class STANDARD

如要对整个前缀执行递归复制并使用 Amazon S3 Standard 存储类覆盖现有对象,请运行以下命令:

aws s3 cp s3://awsexamplebucket/dir1/ s3://awsexamplebucket/dir1/ --storage-class STANDARD --recursive --force-glacier-transfer

如要将对象复制到其他位置,请运行以下命令:

aws s3 cp s3://awsexamplebucket/dir1/example.obj s3://awsexamplebucket/dir2/example2.obj