【发布时间】:2016-12-23 20:21:15
【问题描述】:
我正在通过此代码将文件从 Android 设备上传到 S3 存储桶
TransferUtility trasnferManager = new TransferUtility(s3, context);
trasnferManager.upload(..,..,..);
之后,我将一个 lambda 触发器附加到 S3:ObjectCreated 事件。
执行 lambda 时,我试图通过 S3.getObject() 函数获取文件。不幸的是,有时我收到“NoSuchKey:指定的密钥不存在:”错误。之后 lambda 重试几次并成功获取文件并继续执行。
我认为 lambda 函数是在 S3 中的文件可用之前执行的?但这不应该是设计使然。应该在 S3 上的文件上传完成后触发。
根据 2015 年 8 月 4 日的公告:
所有区域中的 Amazon S3 存储桶提供 read-after-write 一致性 新对象的 PUTS 和覆盖 PUTS 的最终一致性 并删除。
Read-after-write一致性允许您在 Amazon S3 中创建对象后立即检索。
但在此之前:
除美国标准(重命名为美国东部(弗吉尼亚北部))以外的所有地区都支持read-after-write 上传到 Amazon S3 的新对象的一致性。
我的存储桶位于美国东部(弗吉尼亚北部)区域,它是在 2015 年 8 月 4 日之前创建的。我不知道这可能是问题...
编辑:20.10.2016
根据documentaion - EVENTUALLY CONSISTENT READ 操作可能会返回 NO RESULT,即使之前已完成两个或多个 WRITE 操作.
在本例中,W1(写 1)和 W2(写 2)都在 R1(读 1)和 R2 开始之前完成 (阅读 2)。对于一致的读取,R1 和 R2 都返回 color = ruby。对于一个最终一致的 读取时,R1 和 R2 可能返回 color = red、color = ruby 或无结果,具体取决于数量 已经过去的时间。
【问题讨论】:
-
请提及您正在使用的终点并在您的问题中添加更多代码。这可能会有所帮助 - forums.aws.amazon.com/ann.jspa?annID=3112
-
我遇到了类似的问题,但并非总是如此。我发现大文件会发生这种情况。我有一个触发 lambda 的事件,大多数时候 lambda 然后尝试移动文件并成功。在较大的文件(38mb jpg)上,它说它不存在并且失败。一旦 lambda 由于失败而重新初始化以重试,它就可以正常工作。在文件可访问之前触发事件似乎很荒谬。
-
这里也一样。即使是小文件。 @乔尔
-
有没有人幸运地解决了这个问题?
-
+1,我们使用新加坡中心,新文件面临这个问题。平均而言,每上传 500 个文件就会发生一次。
标签: amazon-s3 aws-lambda aws-sdk amazon-javascript-sdk