如果S3中的更新对象充当lambda触发器,是否存在固有的竞争条件?

时间:2017-07-05 03:37:45

标签: amazon-web-services amazon-s3

如果我更新S3 Bucket中的对象,并将该S3 PUT事件作为我的Lambda触发器触发,那么鉴于S3的最终一致性模型,Lambda是否有可能对该对象的旧版本进行操作?

我有一个时间解析权威答案的魔鬼...

2 个答案:

答案 0 :(得分:3)

是的,对象的盲GET可能会获取以前的版本。

至少有两种解决方案可供考虑。

弱:notification event data包含新上传对象的etag。如果您获取的对象在其响应标头中没有相同的etag,那么您知道它不是预期的对象。

强:在存储桶上启用版本控制。然后,事件数据包含对象versionId。从S3下载对象时,请在请求中指定此确切版本。当您覆盖一个对象然后使用特定的版本ID下载它时,一致性模型没有得到很好的记录,因此这可能会导致偶尔出现404 - 在这种情况下,您几乎可以肯定地避免了获取旧对象 - 但你至少可以确信S3永远不会给你一个明确指定的版本。

如果您还没有在存储桶上使用版本控制,那么您将要考虑是否保留旧版本,或者是否创建一个生命周期策略来清除它们......但是一个出色的工程设计关于版本控制的功能是,在没有版本控制意识的情况下编写的代码部分仍然可以在启用版本控制的情况下正常运行 - 如果您向S3发送非版本控制的请求,它仍然可以做正确的事情......例如,如果你删除了一个没有指定版本ID的对象,并且稍后尝试GET该对象而没有指定版本ID,则S3将正确地响应404,即使"已删除"版本实际上还在桶中。

答案 1 :(得分:1)

文件如何首先到达那里?我问,因为如果您可以撤消订单,它会解决您的问题,因为您在覆盖文件之前通过lambda将文件放入s3,可以先从存储桶中获取现有版本并执行无论你需要什么。