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

标签 amazon-web-services amazon-s3

如果我更新 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/

相关文章:

amazon-web-services - 获取所有给定前缀的s3存储桶

amazon-web-services - AWS : serve multiple sites under the same domain

amazon-s3 - 在 cloud foundry 中自动备份 maria db 和 s3

amazon-web-services - aws s3 或 sqs 客户端中 withRegion() 和 withEndpointConfiguration() 方法的区别

ios - 从 Amazon S3 Bucket iOS 下载多个项目

python - Requirements.txt 对弹性 beanstalk 上的 conda/pip 无效

amazon-web-services - AWS-modyfing lambda 是否会立即更新 CloudFormation 堆栈?

node.js - 确定 AWS S3 上传的部分大小和队列大小参数

apache-spark - 在Spark中的AWS EMR集群上处理Google Storage中的数据

amazon-web-services - 如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置