#aws-lambda #aws-step-functions
#aws-лямбда #aws-пошаговые функции
Вопрос:
У меня есть лямбда-код на основе Python (core Lambda), обслуживающий синхронный API. API запускается из пользовательского интерактивного приложения. Теперь мне нужно добавить некоторые журналы и метрики (немного требующие больших вычислительных затрат) к лямбде. Я не хочу, чтобы это задерживало основную лямбду. Я хочу поместить это в новую лямбду (logging Lambda). Чего я хочу, так это — core Lambda завершает свою работу, запускает logging Lambda (fire amp; forget) и немедленно возвращает ответ на вызов API. Конечное состояние (успех / неудача) лямбды протоколирования не имеет значения.
Могут ли «Пошаговые функции» достичь этого? Основные и логирующие лямбды имеют свое собственное конечное состояние, и я не уверен, что шаблон функции «Шаг» может вместить это.
Комментарии:
1. я бы предложил использовать SNS. Доставка сообщений в SNS по-прежнему будет синхронной, но вычисления в вашем лямбде ведения журнала будут асинхронными.
2. @kkesley- Спасибо, это вариант, который я могу попробовать
Ответ №1:
Вы можете запустить асинхронный вызов лямбда-функции, используя "InvocationType": "Event"
in ваши параметры Invoke. Чтобы сделать это в пошаговых функциях, код ASL выглядит следующим образом:
{
"StartAt": "Invoke Lambda function asynchronously",
"States": {
"Invoke Lambda function asynchronously": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "myFunction",
"Payload.$": "$",
"InvocationType": "Event"
},
"End": true
}
}
}
Наличие асинхронной лямбда-задачи (как показано выше) после вашей основной лямбда-задачи кажется, что она должна работать. Чтобы убедиться, что сбой лямбда-кода ведения журнала не влияет на общий рабочий процесс, вы можете добавить к нему ловушку States.ALL
и перенаправить в Succeed
состояние.
Комментарии:
1. Смогли ли вы отправить пользовательскую полезную нагрузку, когда использовали
InvocationType
asEvent
? В настоящее время я не могу отправлять полезную нагрузку при использованииEvent
.
Ответ №2:
Если вторичный лямбда-код вызывается исключительно для целей ведения журнала, а конечный автомат не зависит от его выходных данных, вы можете вызвать вторичный лямбда-код из вашего основного лямбда-кода, а затем вернуться из основного лямбда-кода. Таким образом, вашему конечному автомату не нужно знать об этапах ведения журнала, и вы можете «запустить и забыть» перед возобновлением рабочего процесса.
Комментарии:
1. @aws-jordan- Спасибо. Требуется ли для этого функция step или это просто основная лямбда, вызывающая лямбда-логирование асинхронно? Я не знал, что можно асинхронно запускать дочернюю лямбду.