在存储桶之间进行同步时,aws s3同步cli会忽略分段上传配置

时间:2019-11-13 03:38:26

标签: amazon-s3 aws-sdk

我正在尝试将大量文件从一个存储桶同步到另一个存储桶,像这样使用aws cli的s3 sync命令后,某些文件的大小最大为2GB

aws s3 sync s3://bucket/folder/folder s3://destination-bucket/folder/folder

并验证已传输的文件,很明显,大文件丢失了原始存储桶中原始文件上存在的元数据。

这是较大文件的“已知”问题,其中s3切换到分段上传以处理传输。 可以通过.aws / config文件配置此多部分处理,就像这样

[default]
s3 =
    multipart_threshold = 4500MB

但是,当再次测试传输时,仍然不存在较大文件上的元数据时,元数据存在于任何较小文件中,因此很明显,我正在解决分段上传问题。

鉴于这是从s3到s3的传输,是否完全考虑了本地s3配置? 作为替代方案,既然已经传输了所有文件,有没有一种方法可以仅同步元数据?

也尝试过aws s3 cp也不运气。

2 个答案:

答案 0 :(得分:0)

您可以使用跨/相同区域复制将对象复制到另一个Amazon S3存储桶。

但是,只有新添加的对象会在存储桶之间复制。但是,您可以通过将对象复制到自身上来触发复制。我建议您首先在一个单独的存储桶中对此进行测试,以确保您不会意外丢失任何元数据。

建议的方法似乎相当复杂:Trigger cross-region replication of pre-existing objects using Amazon S3 inventory, Amazon EMR, and Amazon Athena | AWS Big Data Blog

最后的选择是编写自己的代码以复制对象,并同时复制元数据。

或者,您可以编写一个脚本,比较两个存储桶,以查看没有获取了正确的元数据的对象,并使其仅更新了目标上的元数据宾语。这实际上涉及在指定元数据的同时将对象复制到自身。这可能比自己复制 ALL 对象容易,因为它只需要“修复”未获取元数据的对象即可。

答案 1 :(得分:0)

最终设法实现了一个解决方案,并借此机会尝试了无服务器框架和步骤功能。

我所遵循的一般流程是:

  • 使用针对“ CompleteMultipartUpload”类型的S3事件的Cloudwatch事件规则触发了“步函数”,因为元数据仅在必须使用多部分流程进行传输的S3对象上丢失了
  • Step Function上的初始Task检查引发事件的对象上是否存在所有必需的MetaData。
    • 如果存在,则表示步进功能已完成
    • 如果不存在,则将执行第二个lambda任务,该任务会将所有元数据从源对象复制到目标对象。

这可以在没有“步进功能”的情况下实现,但这是让他们轻松进行的一个很好的简单练习。第一个“检查元数据”任务实际上是多余的,因为如果使用多部分传输,则元数据将永远不存在,我最初也触发了PutObject和CopyObject,这就是为什么我要执行“检查元数据”任务。