更有效地使用AWS S3同步吗?

时间:2019-02-12 18:59:53

标签: amazon-web-services amazon-s3

最近,我们注意到我们的AWS账单比平时要高。这是由于在我们的常规构建过程中添加了aws s3 sync任务。构建过程会生成大约3,000个文件。构建完成后,我们运行aws s3 sync将它们成批上传到存储桶中。问题是,这在金钱上很昂贵。每次上传都会给我们带来2美元的费用(我们认为),这加起来每月的账单让人大跌眼镜。

所有这些文件(可能只有1个或2个)实际上在构建之间会发生变化。其余的总是一样的。然而aws s3 sync看到它们都改变了,并上传了全部。

文档说aws s3 sync比较文件的最后修改日期和字节大小,以确定是否应该上传。构建服务器每次都会创建所有这些新文件,因此上次修改日期始终会更改。

我想做的是让它计算每个文件的校验和或哈希值,然后使用该哈希值比较文件。 Amazon s3 already has the etag field which is can be an MD5 hash of the file.但是aws s3 sync命令不使用etag。

是否可以使用etag?还有其他方法吗?

最终结果是,我只想上传实际上不同的1个或2个文件(并节省大量成本)

4 个答案:

答案 0 :(得分:1)

S3每1000个PUT请求(doc)收取0.005美元,因此极其上载3,000个文件的每次构建成本为2美元,这不太可能。如果您每天运行50至100个版本,则可能是每天 $ 2,但这仍然不多。

如果您确实为每个构建支付了那么多费用,则应启用CloudTrail事件并查看实际编写了多少内容(为此,也许您已经创建了某种递归CloudTrail事件日志)。

  

最终结果是,我只想上传实际上不同的1个或2个文件

这些文件是您的构建产生的工件吗?如果是,为什么不添加一个明确复制它们的构建步骤?

答案 1 :(得分:1)

aws s3 sync命令具有一个--size-only参数。

来自aws s3 sync options

  

--size-only(布尔值)使每个键的大小成为决定是否从源到目标同步的唯一标准。

如果更新了具有相同内容的文件,这可能会避免复制所有文件。

答案 2 :(得分:0)

作为s3 sync或cp的替代方法,您可以使用s5cmd

https://github.com/peak/s5cmd

如果大小和日期不同,它可以同步文件,并且速度高达4.6gb / s

sync命令示例:

AWS_REGION=eu-west-1 /usr/local/bin/s5cmd -stats cp -u -s --parents s3://bucket/folder/* /home/ubuntu

答案 3 :(得分:0)

我遇到的问题是在--include选项中使用通配符*。使用一个通配符很好,但是当我添加第二个*如 / log。时,sync似乎试图下载所有要比较的东西,这占用了大量CPU和网络带宽。