`aws s3 sync` 如何确定文件是不是已更新?

Posted

技术标签:

【中文标题】`aws s3 sync` 如何确定文件是不是已更新?【英文标题】:How does `aws s3 sync` determine if a file has been updated?`aws s3 sync` 如何确定文件是否已更新? 【发布时间】:2017-09-17 16:50:30 【问题描述】:

当我在终端中背靠背运行命令时,它不会第二次同步。太棒了!它不应该。但是,如果我运行我的构建过程并以编程方式运行aws s3 sync,它会两次同步所有文件,就好像我的构建过程第二次改变了一些不同的东西一样。

不知道会发生什么。有什么想法吗?

我的构建过程基本上是pug source/ --out static-site/stylus -c styles/ --out static-site/styles/

【问题讨论】:

这可能是 Amazon S3 [最终一致](Amazon S3 数据一致性模型)的结果。如果在两次执行之间设置延迟,它的表现会更好吗? 我尝试过几分钟。结果相同。 【参考方案1】:

这篇文章有点过时了,但我仍然会为通过谷歌到达这里的人们做出贡献。

我同意已检查的答案。要添加额外的上下文,AWS S3 的功能在很多方面都不同于标准的 linux s3。在 Linux 中,可以计算 md5hash 以确定文件是否已更改。 S3 不这样做,因此它只能根据大小和/或时间戳来确定。更糟糕的是,AWS 在传输任何一种方式时都不保留时间戳,因此在同步到本地时会忽略时间戳,仅在同步到 s3 时使用。

【讨论】:

【参考方案2】:

AWS CLI sync:

如果本地文件的大小为 与s3对象的大小不同,最后修改时间为 本地文件比 s3 对象的最后修改时间新, 或者指定存储桶下不存在本地文件并且 前缀。

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

您需要--size-only 选项,它只查看文件大小而不是最后修改日期。这对于会频繁更改上次修改日期但不会更改文件实际内容的资产构建系统来说是完美的(我在 webpack 构建中遇到了这种情况,即使文件内容相同,字体等内容也会保持同步)。如果您不使用将内容的哈希合并到文件名中的构建方法,则可能会遇到问题(如果构建发出相同大小的文件但内容不同),请注意这一点。

我确实手动测试了添加一个不在远程存储桶上的新文件,它确实被添加到远程存储桶中,--size-only

【讨论】:

嗯...但是如果我在 html 文件中将单词“lump”更改为“pump”或类似的一些微小更改,不会改变文件大小? @Costa 不,不会。但我建议使用将哈希附加到文件名的构建系统。至少这对于说 CSS 和 javascript 文件很有用。在我的项目中,我通常只有一个根 index.html 文件,因此我只需将其同步为部署命令的一部分。但是,如果您有很多 HTML 文件,您可能希望通过不同方式同步它们来解决这个问题。 明白了。这是一个很好的策略:) 我希望 S3 只存储文件内容的哈希值作为检查更改的一种方式。我想知道我是否可以最终实现它... o _ O @Costa 我同意——如果 S3 具有类似于 rsync 和其他同步工具的选项,那将是最好的前进方式。做自己是一个有趣的想法,似乎它会起作用(只需决定将文件名映射存储到哈希的位置 - 即放入 git repo 或将其单独放在 s3 上或仅从一台服务器部署并保持本地到那个或...)。【参考方案3】:

据此 - http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

S3 同步比较文件的大小和最后修改的时间戳,以查看是否需要同步文件。

在您的情况下,我怀疑构建系统会导致更新的时间戳,即使文件大小没有改变?

【讨论】:

有一个--exact-timestamps 选项,当时间戳完全匹配时,相同大小的项目将被忽略。默认行为是忽略相同大小的项目,除非本地版本比 S3 版本新。 嗯...并没有真正的帮助。为了解决这个问题,我需要中断 pug 的编译命令来运行 cmp 或其他东西。我无法想象如何开始这样做。我想我会放弃这个项目。

以上是关于`aws s3 sync` 如何确定文件是不是已更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS AppSync 将文件上传到 AWS S3

AWS S3 Sync - 结算报表GetObject(拒绝访问)

如何将 AWS S3 存储桶与远程非 AWS 服务器上的文件同步?

使用nodejs中的AWS Lambda函数上传音频文件

如何使用 Java SDK 将目录与 AWS S3 同步?

S3 / Cloudfront 下载限制