【问题标题】:AWS Lambda: "End of stream" error when interacting with S3AWS Lambda:与 S3 交互时出现“流结束”错误
【发布时间】:2019-06-11 15:15:00
【问题描述】:

我有一个 AWS Lambda 函数,它从 S3 读取文件,转换它们,然后将它们写入另一个 S3 存储桶。最初,该功能完美运行。但是,有时,在重复使用后,我会收到此错误有效负载:

{
    "errorMessage": "End of stream",
    "errorType": "lambda_handler",
    "stackTrace": []
}

为什么?

【问题讨论】:

  • 如果由于到达流的末尾而没有可用的字节,则返回值-1。因此,您正在读取的文件很可能是空的,因此会返回此错误。
  • @CarlosAlvesJorge 但反复读取同一个文件后出现,该文件不为空。
  • 在写入之前尝试将流移动到位置 0,然后查看它是否解决了问题

标签: amazon-web-services aws-lambda


【解决方案1】:

我不确定您使用的是什么技术,但您是否正确处理流和/或在尝试再次读取之前寻求在流上定位 0?

Lambda 函数不保证干净启动。它实际上是一个重用可能包含先前调用状态的先前容器的功能

执行 Lambda 函数后,AWS Lambda 会维护 执行上下文一段时间以期待另一个 Lambda 函数调用。实际上,服务冻结了执行 Lambda 函数完成后的上下文,并解冻上下文 重用,如果 AWS Lambda 在 Lambda 选择重用上下文 再次调用函数。这种执行上下文重用方法具有 以下含义:

您的 Lambda 函数代码中的任何声明(在处理程序之外) 代码,请参阅编程模型)保持初始化,提供额外的 再次调用函数时的优化。例如,如果您的 Lambda 函数建立数据库连接,而不是 重新建立连接,原来的连接被用于 后续调用。我们建议在您的代码中添加逻辑以检查 如果在创建之前存在连接。

每个执行上下文在 /tmp 目录。执行时目录内容保留 上下文被冻结,提供可用于的临时缓存 多次调用。您可以添加额外的代码来检查缓存是否有 您存储的数据。有关部署限制的信息,请参阅 AWS Lambda 限制。

由您的 Lambda 函数发起的后台进程或回调 如果 AWS Lambda 在函数结束时未完成恢复 选择重用执行上下文。你应该确保任何 代码中的后台进程或回调(如果是 Node.js) 在代码退出之前完成。

https://docs.aws.amazon.com/lambda/latest/dg/running-lambda-code.html

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2018-07-26
    • 2016-02-08
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2020-07-04
    • 2016-11-02
    相关资源
    最近更新 更多