使用 NodeJS 将文件从 S3 Glacier 移动到 S3 Standard valid xml

Moving files from S3 Glacier to S3 Standard valid xml with NodeJS

我已成功使用 copyObject 将文件从 S3 Standard 移动到 S3 Glacier。现在我正在尝试使用 restoreObject 将文件从 S3 Glacier 移回 S3 Standard。

我根据在 restoreObject documentation 找到的内容创建了要传递给 restoreObject 的 params 变量,但是当我尝试调用 restore 时,我得到:

您提供的 XML 格式不正确或未根据我们发布的架构进行验证。

这是我使用的定义:

const glacierRestore = {
        Bucket: process.env.AWS_BUCKET,
        Key: 'file name goes here',
        RestoreRequest: {
            OutputLocation: {
                S3: {
                    BucketName: process.env.AWS_BUCKET,
                    Prefix: 'X',
                    StorageClass: 'STANDARD'
                }
            },
            Tier: 'Standard'
        }
    };

我错过了什么?我想我有我想做的所有必填字段。有没有一个地方我可以验证我的 xml 是否会给我更多反馈然后只是它无效?

我知道这是 JSON 但它必须将其转换为 XML。

我终于找到了一种方法来做我想做的事,我想我至少会记录下来,这样如果其他人试图做类似的事情,他们可能会在我的解决方案中找到一些帮助。

首先,我无法使用 RestoreRequest 中的 OutputLocation 进行恢复,除非我正在执行 select,但我想进行文件恢复,所以我不得不采取不同的方式。

我使用 s3.headObject() 从文件中获取信息,以便确定它的状态。当文件在标准存储中时 Class 我会得到这样的结果:

{
  AcceptRanges: 'bytes',
  LastModified: 2020-06-03T20:53:28.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {}
}

一旦我将它移动到 Glacier Storage Class 我会得到类似的东西:

{
  AcceptRanges: 'bytes',
  LastModified: 2020-06-03T20:56:11.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {},
  StorageClass: 'GLACIER'
}

现在 returned 信息中添加了存储Class。有趣的来了。我使用 s3.restoreObject() 从 Glacier 获取文件,但这只会创建一个临时副本(默认为 1 天),该临时副本会在该时间段后删除,但会将副本保留在 Glacier 中。我想在 Standard 中有一个副本并在 Glacier 中删除副本我必须尝试弄清楚文件何时恢复,以便我可以将它们复制到 Standard 并从 Glacier 中删除它们。

问题是 Glacier 默认需要 3-5 小时才能将文件复制到 Standard,因此我必须创建一个进程来执行此操作。我有一个进程,每 5 分钟检查一次,看看是否有任何文件已临时恢复,以便我可以复制它们并删除 Glacier 副本。当文件正在从 Glacier 中检索并临时复制时,文件 return 的 s3.headObject 类似于:

{
  AcceptRanges: 'bytes',
  Restore: 'ongoing-request="true"',
  LastModified: 2020-06-03T20:56:11.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {},
  StorageClass: 'GLACIER'
}

现在文件有一个恢复标签,上面写着正在进行的请求 = "true",这让我知道文件正在从 Glacier 恢复。从 Glacier(临时)恢复文件后,s3.headObject return 编辑了如下内容:

{
  AcceptRanges: 'bytes',
  Restore: 'ongoing-request="false", expiry-date="Sun, 07 Jun 2020 00:00:00 GMT"',
  LastModified: 2020-06-03T20:56:11.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {},
  StorageClass: 'GLACIER'
}

现在还原显示正在进行的请求 = "false" 所以我知道还原已完成,我可以将文件复制 (s3.copyObject()) 到标准并从中删除文件冰川。