存储桶之间的AWS S3同步会覆盖较新的目标文件

时间:2017-07-12 09:43:18

标签: amazon-web-services amazon-s3 aws-cli

我们有两个s3存储桶,我们有一个同步cron作业,应该将bucket1更改复制到bucket2。

aws s3 sync s3://bucket1/images/ s3://bucket2/images/

当一个新图像添加到bucket1时,它会被正确地复制到bucket2。

但是,如果我们将该图像的新版本上传到bucket2,当下次运行同步作业时,它实际上将旧版本从bucket1复制到bucket2,替换我们刚刚放在那里的较新版本。

这是迁移过程的一部分,并且及时上传图像的唯一位置将是bucket2,但有时它们可​​能会上传到其中任何一个,我们只希望将存储桶1的更改复制起来to bucket2,而不是反过来。

为什么aws同步作业似乎认为bucket1上的文件已经改变?难道不知道bucket2中的文件是否更新,所以应该单独留下它?

1 个答案:

答案 0 :(得分:4)

AWS Command-Line Interface (CLI) --exact-timestamps命令将内容从源位置复制到目标位置。它仅复制自上次同步以来添加或更改的文件。

它被设计为单向同步,而不是双向同步。您的文件被覆盖,因为源中的文件不在Destination中。这是正确的行为

调整这些控件的范围有限,例如(来自sync command documentation):

  

DECLARE @batch INT =3 SELECT * FROM Yourtable a LEFT JOIN Yourtable b ON a.[Id] = ( ( b.[Id] - 1 ) % @batch ) + 1 AND a.[Id] <> b.[Id] AND b.[Id] BETWEEN @batch + 1 AND @batch * 2 LEFT JOIN Yourtable c ON a.[Id] = ( ( c.[Id] - 1 ) % @batch ) + 1 AND a.[Id] <> c.[Id] AND c.[Id] BETWEEN ( @batch * 2 ) + 1 AND @batch * 3 LEFT JOIN Yourtable d ON a.[Id] = ( ( d.[Id] - 1 ) % @batch ) + 1 AND a.[Id] <> d.[Id] AND d.[Id] BETWEEN ( @batch * 3 ) + 1 AND @batch * 4 WHERE a.[Id] <= @batch (布尔值)当从S3同步到本地时,只有当时间戳完全匹配时,才会忽略相同大小的项目。默认行为是忽略相同大小的项目,除非本地版本比S3版本更新。

但是,似乎没有一个选项可以仅仅因为存在具有相同名称的文件而停止覆盖文件,或者优先保留更新文件。

如果您想要使用更具体的规则进行双向同步,则需要自行编码。