附加到S3 ObjectCreated事件的AWS Lambda返回"NoSuchKey:指定的密钥不存在:

bpa*_*lov 9 amazon-s3 amazon-javascript-sdk aws-sdk aws-lambda

我通过此代码将文件从Android设备上传到S3存储桶

TransferUtility trasnferManager = new TransferUtility(s3, context);
trasnferManager.upload(..,..,..);
Run Code Online (Sandbox Code Playgroud)

之后我将一个lambda触发器附加到S3:ObjectCreated事件.

执行lambda时,我试图通过S3.getObject()函数获取文件.不幸的是,有时我收到" NoSuchKey:指定的密钥不存在: "错误.在此之后,lambda重试几次并成功获取文件并继续执行.

在我看来lambda函数是在S3中的文件可以使用之前执行的吗?但这不应该在设计上发生.S3上的文件上传完成后,应触发触发器.

根据20158月4日的公告:

所有Regions中的 Amazon S3存储桶为新对象的PUTS 提供了读写后一致性,并为覆盖PUTS和DELETES提供了最终一致性.

写入后读取一致性允许您在Amazon S3中创建后立即检索对象.

但在此之前:

美国标准(更名为美国东部(弗吉尼亚北部))之外的所有地区都支持 上传到Amazon S3的新对象的读写后一致性.

我的水桶在美国东部(弗吉尼亚北部)地区,它是在2015年8月4日之前创建的 .我不知道这可能是问题......

编辑:20.10.2016

根据文档 - EVENTUALLY CONSISTENT READ操作可能会返回NO RESULT,即使之前已完成两个或更多WRITE操作.

在此示例中,W1(写入1)和W2(写入2)都在R1(读取1)和R2(读取2)开始之前完成.对于一致读取,R1和R2都返回color = ruby​​.对于最终一致的读取,R1和R2可能返回color = red,color = ruby​​,或者没有结果,具体取决于已经过的时间量.

一致的例子

sup*_*azi 4

有时,当文件很大时,会使用分段上传的方式进行上传,并在文件完全上传之前向 lambda 发送触发器。推测与触发Lambda函数的事件有关。在 lambda 函数的事件字段中,确保将 put 和complete 分段上传添加到事件中。

  • 此问题与文件大小无关。即使在小文件(~200kB)上也会发生这种情况。 (3认同)