无法将Glacier深度存档恢复到不同的S3存储桶



我正在尝试将已启用生命周期规则的文件恢复到Glacier深度归档。当我试图用AWS CLI上的以下命令恢复到不同的目录时,它在下载了几个文件后抛出了一个错误。

用于恢复目录的命令:aws s3 cp s3://xxxxxxx/cf ant prod/year=2020/s3://xxxxxxxx/atest/--强制冰川转移--存储类STANDARD--递归--配置文件mfa

错误:调用CopyObject操作时发生错误(InvalidObjectState(:该操作对源对象的存储类无效

正如您在另一个问题中提到的,--force-glacier-transfer参数不会恢复Glacier中存储的对象。这只是一种避免发出警告通知的方法。

要从冰川深处档案中检索,您需要:

  • 使用恢复对象将存储类更改为标准或标准IA--这将需要一些时间才能恢复
  • 将文件复制到所需位置

不可能执行即时还原或还原+复制。

正如约翰·罗滕斯坦所提到的,似乎必须对冰川中的一个物体进行简单的恢复"就位";并且一旦恢复,就可以根据需要对其进行操作(复制(。

我试图通过Lambda做一些类似于问题主题的事情,我挣扎了一段时间,因为我发现文档中关于restoreObject()请求要么是SQL Select对象还原要么是简单的单个对象还原这一事实很模糊。。。以及最重要的是,哪些参数适用于哪种操作模式。

我的目标是将Glacier中的一个对象恢复到同一个bucket中的新位置/文件名。文档强烈建议这是可能的,因为OutputLocation中存在允许指定BucketNamePrefix的参数。。。因为这些参数似乎只适用于SQL Select对象恢复。

对我来说,令人困惑的部分与restoreObject()方法的参数有关——没有足够的区别来知道,例如,在使用GlacierJobParameters参数进行简单恢复请求时,不能提供Description参数。。。令我沮丧的是,我会遇到以下错误:

MalformedXML: The XML you provided was not well-formed or did not validate against our published schema

没有指示发布的模式位于何处,并且在谷歌上搜索发布的模式没有产生似乎适用于S3 API的结果。。。我的希望是,我可以从API文档中取出;已发布的架构";。。。(在哪里/如何发布?(

我的建议是改进restoreObject()方法的文档,和/或将restoreObject()方法拆分为simpleRestoreObject()sqlRestoreObject()对象,以便参数模式完全不同。

从S3 Glacier Deep Archive(或Glacier,就这一点而言(恢复对象必须单独完成,并且在将这些对象复制到其他位置之前

实现这一点的一种方法是首先使用s3 ls(例如(检索所需文件夹中的对象列表

aws s3 ls s3://xxxxxxx/cf-ant-prod/year=2020/ --recursive

并且,使用每个对象名称,分别运行一个恢复命令:

aws s3api restore-object --bucket s3://xxxxxxx --key <keyName> --restore-request Days=7

这将为每个对象启动一个标准的恢复请求,因此预计需要12-24小时。然后,一旦恢复完成,您就可以使用上述语法自由复制这些对象。

另一种选择是使用s3cmd这样的工具,它支持给定bucket和文件夹的递归恢复。但是,在运行cp命令之前,您仍然需要等待恢复请求完成。

相关内容

最新更新