当将20M文件下载到/tmp
时,Amazon Lambda函数调用偶尔会因设备上没有剩余空间而失败。 lambda限制页面清楚地表明,短暂磁盘容量(“/ tmp”空间)的限制是512M,可能是每个lambda调用,而不是每个lambda函数的所有调用。
以下是详细信息:
同时调用lambda函数(java 8运行时,角色“lambda_basic_execution”)(40个并发调用)。每次调用都从s3下载数据(在所有情况下,数据都低于512M限制)。随机地,这些调用中有4到5个因设备上没有剩余空间错误而失败。我相信这些调用中的一些最终会在同一台机器和相同的JVM中共享,它们共享512M临时磁盘的限制。对我来说听起来像个错误。
这是堆栈跟踪:
.....Caused by: java.io.IOException: No space left on device at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(FileOutputStream.java:326) at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) at com.amazonaws.services.s3.internal.ServiceUtils.downloadToFile(ServiceUtils.java:295) ... 5 more
非常感谢任何建议或解决方法。
Cross贴在这里:https://forums.aws.amazon.com/thread.jspa?threadID=209428
答案 0 :(得分:7)
每个Lambda函数在其自己的/ tmp目录中接收500MB的非持久磁盘空间。
您的环境可能被重用,因此您的临时文件可能会累积并最终超出限制:
为了提高性能,AWS Lambda可以选择保留您的函数实例并重复使用它来提供后续请求,而不是创建新副本。你的代码不应该假设这总是会发生。
因此,尝试删除不再需要的临时文件。您还可以插入一些调试代码来列出/tmp
目录中可能包含的内容以确定原因。
答案 1 :(得分:0)
尝试S3并在每次调用时使用唯一的文件夹名称,并在完成后使用生命周期来清理它们。 (我认为在某些时候安装EFS可能也是一种选择。)