Внутри определенной функции я хочу остановить весь процесс Lambda, но не вызвать ошибку. Я пробовал смотреть на переменную контекста, чтобы остановить это, или просто вызывать exit(), но каждый раз это обрабатывается как ошибка, которую я не хочу отслеживать.
Как я могу успешно завершить лямбда-процесс в Python?
@krishna просто exit(), и он регистрирует Process exited before completing request и регистрирует это как ошибку
@JohnRotenstein Я пробовал как sys.exit (0), так и os._exit (1), и они все еще считаются ошибками
Я переписал функцию, чтобы она возвращалась из основной функции, которая решила ее, помеченной как «ошибки», но все же было бы полезно знать.
Lambda загружает и выполняет код вашей функции как модуль. Вот почему вам нужно создать функцию-обработчик, а не просто использовать обычную точку входа в скрипт. Когда вы вызываете exit() таким образом, вы убиваете все, вместо того, чтобы возвращаться из своей функции, как того ожидает сервер Lambda. Другими словами, exit() всегда будет выдавать это сообщение об ошибке. Вместо этого вам нужно вернуться из своей функции.
@MarkB Параметр предоставляется в NodeJS через contextstackoverflow.com/questions/38660024/…, однако он не предоставляется в context Python, насколько я могу судить. Тот же поток происходит в NodeJS, что и в Python, так почему же NodeJS не выдает ошибку, а Python делает?





В AWS Lambda вы определяете функцию handler, а в Python для успешного выполнения функции просто необходим return, где return подразумевает return None.
То, что вы сделали, правильно, просто укажите несколько точек возврата в этой функции-обработчике. Вы всегда можете записывать сообщения по разным причинам для выполнения функции, если это необходимо.
По памяти это было нелегко (я реорганизовал код, чтобы заставить его работать), потому что это была функция, вызываемая из handler, которая имела бы условие для остановки функции. Я считаю, что то, что я сделал, было return - это конкретная строка или что-то, что будет проверяться вызывающей функцией обработчика, а затем на основе этого будет return. Думаю, мне любопытно, почему версия Lambda для NodeJS имеет такую возможность, а Python - нет. Некоторое время назад я заставил его работать с рефакторингом, так что моя память не очень хороша.
В этом другом вопросе SO упоминаются устаревшие методы, например. context.done(), в новом SDK для nodejs вы должны использовать обратный вызов вместо docs.aws.amazon.com/lambda/latest/dg/…. Этот обратный вызов не является обязательным. В документах упоминается, что он неявно выполнит этот обратный вызов, если вы этого не сделаете, но это не конец выполнения, это просто для облегчения входа в CloudWatch. Функции Javascript будут по-прежнему завершены в конце цикла событий либо путем возврата явного значения, неявного значения undefined по умолчанию, либо путем выдачи исключения, как в Python.
За кулисами Lambda runner - это просто какая-то функция python (или node или другой lang), которая обертывает вашу функцию, он вызывает вашу функцию, передает ей событие и контекст и ждет, пока ваша функция вернет или сгенерирует исключение. Когда вы вызываете другие функции внутри своего обработчика, вы делаете то же самое, в конечном итоге эти другие функции должны завершиться и вернуться к обработчику. Точкой входа и выхода для всей лямбды является и может быть только функция-обработчик.
Не могли бы вы опубликовать код, который выдает ошибку.