2016-08-17 160 views
6

我通过这段代码AWS LAMBDA连接到S3 ObjectCreated事件恢复“NoSuchKey:指定的键不存在:

TransferUtility trasnferManager = new TransferUtility(s3, context); 
trasnferManager.upload(..,..,..); 

上传从Android设备S3存储文件后,我有一个lambda触发连接到S3:ObjectCreated事件

当执行拉姆达我试图通过S3.getObject()函数来获取文件遗憾的是,有时我接受了。“NoSuchKey:指定的键不存在:”错误。之后,lambda重试几次t imes并成功获取文件并继续执行。

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

据公告上2015年8月4日

亚马逊S3水桶所有地区提供读后写一致性 新的对象和覆盖PUTS最终一致性的PUTS 和DELETES。

事务后写入一致性允许您在Amazon S3中创建后立即检索对象。

但这之前:

除了美国标准所有地区(更名为美国东(N.弗吉尼亚州))支持读后写新对象 一致性上传到Amazon S3。

我斗是美国东(N.弗吉尼亚州)区域,它是创建8月4日之前,2015年。我不知道,这可能是问题...

编辑:2016年10月20日

根据documentaion - 最终一致的读取操作可以返回NO RESULT即使两个或更多WRITE操作在它之前已经完成。

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

Consistent example

+0

请注明您所使用的终点,并在你的问题添加更多的代码。这可能有所帮助 - https://forums.aws.amazon.com/ann.jspa?annID=3112 –

+0

我正在使用“s3.amazonaws.com”。我认为这已经过时了,因为据说“所有地区的Amazon S3存储桶都提供了读写后一致性”,而没有附加信息。 – bpavlov

+1

我有类似的问题,但并不总是如此。我发现大文件发生这种情况。我有一个事件触发lambda,并且大部分时间lambda然后试图移动文件并且成功。在较大的文件(38mb jpg)上,它表示它不存在并失败。一旦lambda重新初始化因失败而重试,它可以正常工作。似乎荒谬的是,事件会在文件访问之前触发。 – Joel

回答

1

有时,当文件比较大,他们使用的是多部分上传,它会发送一个触发拉姆达之前文件是完全上传上传的照片。据推测,它与触发Lambda函数的事件有关。在lambda函数的事件字段中,确保将添加和完整的多部分上传添加到事件。

+0

我不知道这是一个选项,但肯定会研究这一点。 – Joel

+1

此问题与文件大小没有关联。它甚至发生在小文件(〜200kB)上。 – bpavlov

+0

@Joel你可以更新当你将多部分上传添加到事件时发生了什么。谢谢 –

0

为了防止这个问题,可以使用S3 SDK服务器。收到通知后,我们可以确保该对象实际存在。例如,对于AWS的JavaScript SDK,可以用下面的代码片段:

s3.waitFor("objectExists", { 
    Bucket: "<bucket-name>", 
    Key: "<object-key>" 
}, callback); 

请注意,WAITFOR会增加你的拉姆达的执行时间,这意味着你将需要延长超时。根据文件,检查将每5秒钟执行20次。因此,将超时设置为1分钟左右应该有助于避免执行超时异常。

链接到文件:AWS JavaScript SDK S3 Class

相关问题