最终一致覆盖 PUT 的 S3 最后修改时间戳

S3 last-modified timestamp for eventually-consistent overwrite PUTs

A​​WS S3 文档指出:

Amazon S3 offers eventual consistency for overwrite PUTS and DELETES in all regions.

http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel

达到完全一致的时间跨度可能会有所不同。在此期间 GET 请求可能 return 以前的对象或更新的对象。

我的问题是:

最后修改的时间戳是什么时候更新的?是覆盖PUT成功但before完全一致后立即更新,还是完全一致后才更新?

我怀疑是前者,但我找不到任何明确说明这一点的文件。

Last-Modified 时间戳应与成功 PUT 请求的响应 headers 中返回的 Date 值匹配。

据我所知,这没有明确记录,但可以从记录的内容中推导出来。

当您覆盖 object 时,最终一致性模型可能会延迟覆盖本身,而不是覆盖内容的可用性给定 S3 节点(S3 被复制到 S3 区域内的多个节点)。

Last-Modified 时间戳与其他元数据一样,在 object 创建时建立,此后不可变。

实际上根本不是object的"modification"时间,而是[=36=的创建时间].这个解释可能听起来很迂腐,但在最严格的意义上是准确的:S3 objects 和它们的元数据实际上根本无法修改,它们只能被覆盖。当您在 S3 中 "overwrite" 一个 object 时,您实际上是在创建一个新的 object,重新使用旧的 object 的密钥(路径+文件名)。这个新 object 在给定 S3 节点(复制)的 可用性 可能会被最终一致性模型延迟......而不是新 object 覆盖旧的...因此 Last-Modified 没有理由受到复制延迟的影响(假设 复制延迟 - 最终一致性有时与即时一致性无法区分。

S3 做的这件事绝对糟糕。

基本上在 Linux 中你有 mtime,它是文件在文件系统上最后修改的时间。任何 S3 客户端都可以收集 mtime 并在 S3 上设置 Last-Modified 时间,以便它可以维护实际上次修改的时间。

相反,Amazon 只是基于对象创建来执行此操作,如果您只是想将数据用作放置它的原始应用程序之外的数据,这实际上是一个大问题。

因此,如果您从 S3 下载文件,您的客户端可能会设置修改时间,如果它在创建时立即上传到 s3,那么您至少会有一个接近正确的时间戳。但现实情况是,您可能拍了一张照片,但它可能几天都无法通过应用程序、堆栈和 S3 从您的 phone 获取!

这甚至不考虑将文件重新上传到 s3。这会使问题复杂化,因为您可能会在多年后重新上传它。 S3 的行为就像 Last-Modified 是几年后文件实际上没有被修改的时候。

他们确实需要允许您进行设置,但他们在其他方面仍然模棱两可且记录过多,因此很难弄清楚。

https://github.com/s3tools/s3cmd/issues/524