从AWS Lambda清除tmp文件夹

时间:2018-08-09 12:08:59

标签: amazon-web-services aws-lambda

嗨,我有一个AWS Lambda环境,其中的临时目录现在已满,我得到以下信息:

java.lang.RuntimeException: java.nio.file.FileSystemException: /tmp/out3786803744412914689: No space left on device

它是无服务器的,所以我不能简单地登录到该框中并删除目录的内容。

除了部署代码更改以在重新启动时清除temp文件夹之外,还有什么方法可以解决此问题?

4 个答案:

答案 0 :(得分:5)

当触发AWS Lambda函数时,将创建一个临时容器。然后,Lambda函数将在容器中运行。

如果多次触发Lambda函数,则可能会创建多个容器。例如,如果该功能需要5秒钟才能运行,并且在一秒钟内触发了10个功能,则可能会配置50个容器。

此外,一旦函数执行完毕,容器可能会保留并在再次触发Lambda函数时再次使用。

因此,没有用于Lambda函数的单个“服务器”。可能很多,也可能是重复使用的。

建议函数在结束执行之前从/tmp删除其临时文件。这样,该空间将可用于下一次执行。

相反,您可能希望有意保留容器中的某些数据,以便下次执行时像缓存一样。例如,如果该函数下载了一些参考数据,那么如果容器被重用,则下次无需重新下载数据。

底线:对该函数进行编程以使其自洁。

答案 1 :(得分:0)

您可以使用(或模拟)github lambdash项目在Lambda函数中构建Lambda shell。

这将允许您使用一组特定的参数来调用Lambda,这些参数将触发Lambda shell功能并执行传递给它的任何shell命令,例如“ rm / tmp / *”。我个人只会考虑在开发环境中使用此功能,而不是在生产环境中使用。

也就是说,“正确”的答案是@约翰·罗滕斯坦的答案。

答案 2 :(得分:0)

我相信您可以删除/tmp文件夹中的内容,因为它将被隔离到您的实例中,这意味着/tmp文件夹中的所有内容都是由您的lambda创建的。

如果还可以,还可以将所有这些数据卸载到某种类型的存储中。

  • S3
  • 发电机
  • Redis

答案 3 :(得分:0)

要添加到@John Rotenstein的答案中,我们的lambda将下载大型ML模型并在调用开始时移至/ tmp。

在python中,我们按照以下方式进行操作:

if not os.path.isdir(f'/tmp/{self.model}'):
    self.download_model()

对于我们的用例,这比在lambda运行结束时清除/ tmp目录要好,因为它减少了对s3的调用和下载次数,从而提高了热启动的性能。这也意味着lambda可以更快地完成,因为它们不需要清理。需要注意的是我们的模型是静态的,因此我们不必担心缓存失效。如果您需要加载经常更改的数据,那么请清除/ tmp目录。