我有一个 AWS Lambda 函数,该函数从 S3 中读取文件,将其转换,然后将其写入另一个 S3 存储桶中。最初,该功能运行良好。但是,有时,在重复使用后,我会得到以下错误负载:
{
"errorMessage": "End of stream",
"errorType": "lambda_handler",
"stackTrace": []
}
为什么?
答案 0 :(得分:0)
我不确定您使用的是什么技术,但是在尝试再次读取之前,您是否正确配置了流并/或在流上定位0?
Lambda函数不能保证干净启动。实际上,这是重用先前容器的功能,该容器可能包含先前调用的状态
执行Lambda函数后,AWS Lambda会维护 在预期另一个Lambda的情况下执行上下文 函数调用。实际上,该服务会冻结执行 Lambda函数完成后的上下文,并解冻 重用(如果AWS Lambda选择在Lambda时重用上下文) 函数再次被调用。这种执行上下文重用方法具有 具有以下含义:
Lambda函数代码中的任何声明(在处理程序之外) 代码,请参阅编程模型)保持初始化状态,并提供其他 再次调用该函数时的优化。例如,如果您的 Lambda函数建立数据库连接,而不是 重新建立连接时,原始连接用于 后续调用。我们建议您在代码中添加逻辑以进行检查 创建连接之前是否存在连接。
每个执行上下文在以下位置提供512 MB的额外磁盘空间: / tmp目录。目录内容在执行时保留 上下文被冻结,提供可用于以下目的的临时缓存 多次调用。您可以添加额外的代码来检查缓存是否具有 您存储的数据。有关部署限制的信息,请参阅 AWS Lambda限制。
由Lambda函数启动的后台进程或回调 如果AWS Lambda恢复了功能结束时未完成的操作 选择重用执行上下文。你应该确保任何 代码中的后台进程或回调(对于Node.js) 在代码退出之前完成。
https://docs.aws.amazon.com/lambda/latest/dg/running-lambda-code.html