【问题标题】:AWS Lambda attached to S3 ObjectCreated event returns "NoSuchKey: The specified key does not exist:附加到 S3 ObjectCreated 事件的 AWS Lambda 返回“NoSuchKey:指定的键不存在:
【发布时间】: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


【解决方案1】:

有时当文件很大时,它们会使用分段上传来上传,并在文件完全上传之前向 lambda 发送一个触发器。推测与触发 Lambda 函数的事件有关。在 lambda 函数的 event 字段中,确保将 put 和 complete multi-part upload 都添加到事件中。

【讨论】:

  • 我不知道这是一个选项,但一定会调查的。
  • 此问题与文件大小无关。它甚至发生在小文件(~200kB)上。
  • @Joel 您能否更新将分段上传添加到活动时发生的情况。谢谢
  • @AhmedAbouhegaza 不幸的是,我不再从事该项目,因此不太可能有机会对此进行测试。你有运气吗?
  • @Joel 我遇到了这个问题,我将多部分添加到事件中,它对我来说效果很好。它甚至发生在小文件中。
【解决方案2】:

为防止出现此问题,可以使用 S3 SDK 服务程序。收到通知后,我们可以确保对象确实存在。例如,对于 AWS JavaScript 开发工具包,您可以使用以下 sn-p:

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

请注意,waitFor 会增加 Lambda 的执行时间,这意味着您需要延长超时时间。根据文档,检查将每 5 秒执行一次,最多 20 次。因此,将超时设置为 1 分钟左右应该有助于避免执行超时异常。

文档链接:AWS JavaScript SDK S3 Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2016-02-19
    • 2019-05-02
    • 2018-05-26
    相关资源
    最近更新 更多