最近,我们注意到我们的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个文件(并节省大量成本)
答案 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
参数。
--size-only
(布尔值)使每个键的大小成为决定是否从源到目标同步的唯一标准。
如果更新了具有相同内容的文件,这可能会避免复制所有文件。
答案 2 :(得分:0)
作为s3 sync或cp的替代方法,您可以使用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和网络带宽。