Привет, у меня есть среда AWS Lambda, где временный каталог теперь заполнен, и я получаю следующее:
java.lang.RuntimeException: java.nio.file.FileSystemException: /tmp/out3786803744412914689: No space left on device
Он бессерверный, поэтому я не могу просто войти в ящик и удалить содержимое каталога.
Есть ли способ исправить это, кроме развертывания изменения кода, чтобы очистить временную папку при перезапуске?





При срабатывании функции AWS Lambda создается временный контейнер. Затем в контейнере запускается лямбда-функция.
Если функция Lambda запускается много раз, возможно, что может быть создано несколько контейнеров. Например, если для запуска функции требуется 5 секунд, а 10 функций запускаются за одну секунду, то может быть подготовлено 50 контейнеров.
Кроме того, после того, как функция завершила выполнение, контейнер мощь будет сохранен и использован снова, если функция Lambda запускается снова.
Итак, не существует единого «сервера», который использовался бы для функции лямбда. Их может быть много, или это может быть один, который используется повторно.
Рекомендуется, чтобы функции удалили свои временные файлы из /tmp перед завершением выполнения. Таким образом, пространство будет доступно для следующего выполнения.
И наоборот, вы можете намеренно хранить некоторых данных в контейнере для следующего выполнения, чтобы действовать как кеш. Например, если функция загружает некоторые справочные данные, ей не нужно будет повторно загружать данные в следующий раз, если контейнер будет повторно использован.
Нижняя граница: Запрограммируйте функцию, которая убирает за собой.
Вы потенциально можете встроить оболочку Lambda в свою функцию Lambda, используя (или эмулируя) проект github лямбдаш.
Это позволит вам вызвать Lambda с определенным набором параметров, которые будут запускать функцию оболочки Lambda и выполнять любую команду оболочки, которую вы ей передали, например "rm / tmp / *". Я бы лично подумал о том, чтобы делать это только для сред разработки, а не для производства.
Тем не менее, «правильный» ответ - это ответ @John Rotenstein.
Я считаю, что вы можете удалить содержимое папки /tmp, поскольку оно будет изолировано от вашего экземпляра, что означает, что все в папке /tmp было создано вашей лямбдой.
Вы также можете выгрузить все эти данные в какое-либо хранилище, если они все еще актуальны.
Чтобы добавить к ответу @John Rotenstein, наши лямбды загружают большую модель ML и перемещаются в / tmp в начале вызова.
В python мы делаем что-то вроде:
if not os.path.isdir(f'/tmp/{self.model}'):
self.download_model()
Для нашего случая использования это лучше, чем очистка каталога / tmp в конце выполнения лямбда-выражения, поскольку это уменьшает количество вызовов и загрузок, необходимых для / из s3, что дает прирост производительности для теплых запусков. Это также означает, что лямбды завершатся быстрее, поскольку их не нужно очищать. Предостережение здесь в том, что наша модель статична, поэтому нам не нужно беспокоиться о недействительности кеша. Если вам нужно загружать часто меняющиеся данные, тогда, конечно, очистите каталог / tmp.
Тогда есть ошибка? Поскольку очистка удаляет файлы, которые я использую (dbl. Проверка w / stat перед выходом), все же свободное место на диске исчезает при следующем вызове