У меня есть лямбда-функция Python 3.6, которая должна загружать зависимости в / tmp (я также использую слои, но требуется / tmp из-за ограничений размера) и импортировать их. У меня есть код, который выполняет часть download-zip-and-extract-to-temp перед обработчиком, ожидая, что его нужно загружать только при холодном запуске. Скажем, это выглядит так (псевдокод):
log('Cold start')
download_deps() # has some log statements of its own
log('init end')
def handler(event, context):
...
Большую часть времени он работает нормально. Однако время от времени журналы перестают отображаться где-то во время инициализации. (Например, он говорит «Холодный старт», но не «конец инициализации»; он «умирает» где-то в download_deps). У меня есть обработка исключений там и регистрировать все, но ничего не появляется. Когда обработчик запускается в следующий раз, он запускается в ImportError.
Пытаясь это исправить, я заметил нечто странное. Код инициализации выполняется дважды при одном вызове Lambda. Учитывая вышеупомянутый псевдокод, журналы выглядят так:
Cold start
<logs from download_deps that indicate it downloaded things into /tmp>
START <RequestId> ...
<RequestId> Cold start
<logs from download_deps that indicate it skipped download because /tmp was already populated by deps>
init end
END <RequestId>
Часть "init end" не появляется в первый раз, поэтому журналы как-то снова исчезают. Поскольку он пропускает загрузку во второй раз (/ tmp сохраняется), я знаю, что не происходит 2 фактических холодных запусков. Во второй раз, когда он регистрирует «холодный старт», он включает RequestId, но не первый раз; почти как если бы первая инициализация не была вызвана запросом, даже если время запроса на шлюзе API совпадает со временем первого «холодного запуска». Что здесь происходит?