Ошибка AWS Lambda, на устройстве не осталось места

Я использую шлюз API для вызова лямбда-функции, которая импортирует файл mpeg (10 МБ) из s3 и сохраняет в / tmp папку лямбда, а лямбда загружает его во внешний API (youtube и т. Д.). Недавно вызов шлюза API для лямбда периодически дает сбой с ошибкой

[Errno 28] No space left on device

Вот как я скачиваю файл

urllib.urlretrieve (s3_mpeg_url, '/tmp/{}'.format(mpeg_filename))

Если я создаю новую версию той же лямбда-функции и назначаю псевдоним шлюзу API, на который указывает, он начинает работать и снова в какой-то момент продолжает получать ту же ошибку

Когда я тестирую эту лямбда-функцию с лямбда-консоли, она всегда работает.

Любая идея ?


person codeexplorer    schedule 19.01.2018    source источник
comment
Вы удаляете файл после того, как закончите с ним? Лямбда-функции можно использовать повторно.   -  person kichik    schedule 19.01.2018


Ответы (1)


Для вашей лямбда-функции доступно около 500 МБ дискового пространства на /tmp. Однако из соображений производительности AWS Lambda может сохранять и повторно использовать экземпляры вашей функции при последующих вызовах. Здесь вы можете пойти двумя путями:

  1. Если ваша функция полностью не имеет состояния (т.е. вам не нужен файл mpeg после его загрузки во внешний API), просто удалите его из папки /tmp после загрузки.
  2. Если вам нужно хранить данные, подумайте о том, чтобы сохранить их на другом носителе, например S3 или DynamoDB, после обработки.
person Viccari    schedule 19.01.2018
comment
Спасибо .. Я изучаю вариант 1, о котором вы упомянули, но он не помог ... пожалуйста, простите меня за отсутствие знаний об удалении файлов на серверах AWS ... Я пробовал os.remove (/ tmp / *. Mpeg), но он не работает (я использую Python в лямбде). Не могли бы вы сообщить мне, как мы можем очистить папку tmp - person codeexplorer; 19.01.2018
comment
Не верьте, что os.remove () поддерживает подстановочные знаки. Удалите файл по имени или воспользуйтесь какой-нибудь функцией glob. - person jarmod; 19.01.2018
comment
это может быть так. он не поддерживает подстановочные знаки. Я использовал следующие, чтобы заставить его работать def emptyDir(folder): fileList = os.listdir(folder) for f in fileList: filePath = folder + '/'+f if os.path.isfile(filePath): os.remove(filePath) elif os.path.isdir(filePath): newFileList = os.listdir(filePath) for f1 in newFileList: insideFilePath = filePath + '/' + f1 if os.path.isfile(insideFilePath):\n os.remove(insideFilePath) - person codeexplorer; 19.01.2018