Я разрабатываю бессерверный бэкэнд для чувствительного ко времени приложения.
Возможно ли выполнение лямбда-функции B через XX минут после лямбда-функции A?
Я ищу чистое бессерверное решение. Использование setTimeout или аналогичного подхода - это слишком хакерский прием, чтобы с ним можно было согласиться.
Пример: Отправить уведомление через SNS через 10 минут после выполнения лямбда-функции.





Да, вы можете сделать это, используя Очереди задержки SQS для запуска лямбда B.
Следующие шаги
Создайте очередь SQS с задержкой сообщения 10 минут. Установите триггер лямбда-B, как указано выше. Теперь после выполнения лямбда-функции A поместите сообщение в SQS.
Теперь, поскольку в SQS установлена задержка, сообщение будет доступно через 10 минут, и как только оно станет доступным, оно запустит Lambda B
Самый простой способ - использовать SQS с отложенной доставкой.
Lambda-A добавляет сообщение в очередь SQS и устанавливает задержку доставки 10 минут. Вы можете установить любую задержку от 0 до 15 минут. Вы также можете использовать очереди задержки SQS для задержки всех сообщений, добавленных в очередь. https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html
Через 10 минут сообщение SQS становится видимым, и SQS запускает Lambda-B.
Lambda-B получает событие Amazon SQS и удаляет сообщение из очереди, используя дескриптор получения. Вот пример из https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-sqs:
.
"Records": [
{
"messageId": "c80e8021-a70a-42c7-a470-796e1186f753",
"receiptHandle": "AQEBJQ+/u6NsnT5t8Q/VbVxgdUl4TMKZ5FqhksRdIQvLBhwNvADoBxYSOVeCBXdnS9P+erlTtwEALHsnBXynkfPLH3BOUqmgzP25U8kl8eHzq6RAlzrSOfTO8ox9dcp6GLmW33YjO3zkq5VRYyQlJgLCiAZUpY2D4UQcE5D1Vm8RoKfbE+xtVaOctYeINjaQJ1u3mWx9T7tork3uAlOe1uyFjCWU5aPX/1OHhWCGi2EPPZj6vchNqDOJC/Y2k1gkivqCjz1CZl6FlZ7UVPOx3AMoszPuOYZ+Nuqpx2uCE2MHTtMHD8PVjlsWirt56oUr6JPp9aRGo6bitPIOmi4dX0FmuMKD6u/JnuZCp+AXtJVTmSHS8IXt/twsKU7A+fiMK01NtD5msNgVPoe9JbFtlGwvTQ= = ",
"body": "{\"foo\":\"bar\"}",
"attributes": {
"ApproximateReceiveCount": "3",
"SentTimestamp": "1529104986221",
"SenderId": "594035263019",
"ApproximateFirstReceiveTimestamp": "1529104986230"
},
"messageAttributes": {},
"md5OfBody": "9bb58f26192e4ba00f01e2e7b136bbd8",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-west-2:594035263019:NOTFIFOQUEUE",
"awsRegion": "us-west-2"
}
]
Спасибо! Вы знаете, почему максимальная задержка составляет всего 15 минут?
Понятия не имею, почему максимальная задержка составляет 15 минут. Это дизайнерское решение, принятое инженерами AWS, я уверен, что у них были свои причины.
Вероятно, вы могли бы достичь того, что ищете, используя таймеры сообщений в SQS.
Функция A должна опубликовать сообщение в очереди с задержкой в 10 минут, а функция B должна подписаться на очередь.
Я думаю, что проще всего это сделать с помощью AWS Step Functions. Вы также можете -
Можете ли вы отменить пошаговую функцию или изменить время?
В пошаговых функциях вы можете использовать выходные данные одного шага в качестве входных данных для другого. Если шаг в настоящее время выполняется, вы не можете его отменить (но в этом нет необходимости). Что касается времени ожидания - «Вы можете выбрать либо относительное время, указанное в секундах с момента начала состояния, либо абсолютное время окончания, указанное как отметка времени». (взято из [Документы AWS] (docs.aws.amazon.com/step-functions/latest/dg/…)). Продолжительность может зависеть от ввода состояния.
Вам следует ознакомиться с AWS Step Functions. docs.aws.amazon.com/step-functions/latest/dg/…