如果我更新 S3 存储桶中的一个对象,并触发该 S3 PUT 事件作为我的 Lambda 触发器,那么在给定 S3 的最终一致性模型的情况下,Lambda 是否有可能对该对象的旧版本进行操作?
无论怎样,我都在花时间解析出一个权威的答案......
最佳答案
是的,对象的盲目 GET
可能会获取以前的版本。
我想到的至少有两种解决方案。
弱:notification event data包含新上传对象的etag。如果您获取的对象的响应 header 中没有相同的 etag,那么您就知道它不是预期的对象。
强:在存储桶上启用版本控制。然后,事件数据包含对象 versionId
。当您从 S3 下载对象时,请在请求中指定该确切版本。当您覆盖一个对象然后使用特定版本 ID 下载它时,一致性模型没有得到很好的记录,因此这可能会导致偶尔出现 404 - 在这种情况下,您几乎可以肯定只是避免了获取数据旧对象 - 但您至少可以确信 S3 永远不会为您提供除明确指定的版本之外的版本。
如果您尚未在存储桶上使用版本控制,您将需要考虑是否保留旧版本,或者是否创建生命周期策略来清除它们......但关于版本控制的一项精心设计的功能是在不了解版本控制的情况下编写的代码部分在启用版本控制的情况下仍应正常运行 - 如果您向 S3 发送不支持版本控制的请求,它仍然会执行正确的操作...例如,如果您删除不指定版本 ID 的对象,然后在不指定版本 ID 的情况下尝试 GET
该对象,S3 将正确响应 404,即使“已删除”版本实际上仍在存储桶中.
关于amazon-web-services - 如果 S3 中更新的对象充当 lambda 触发器,是否存在固有的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44916630/