Загадка кода инициализации (Python) AWS Lambda - PullRequest
0 голосов
/ 06 июня 2019

У меня есть лямбда-функция 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 совпадает со временем первого «холодного запуска». Что здесь происходит?

1 Ответ

0 голосов
/ 07 июня 2019

Я заметил, что два «холодных старта» всегда были на расстоянии ~ 10 секунд.Похоже, если код инициализации занимает более ~ 10 секунд, он перезапускается.Кроме того, в зависимости от продолжительности, указанной в журналах, время, затрачиваемое на повторную инициализацию, включается в расчетную длительность.

Чтобы решить мою проблему, я переместил загрузчик download_deps () в обработчик, убедившись, что он выполняет толькочто угодно, если нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...