AWS Lambda: выполнить функцию B через 10 минут после функции A - PullRequest
0 голосов
/ 06 июля 2018

Я разрабатываю серверный бэкэнд для приложения, чувствительного ко времени.

Можно ли выполнить лямбда-функцию B XX минут после лямбда-функции A?

Я ищу чистое безсерверное решение. Использование setTimeout или подобного подхода слишком хакерское решение, чтобы его можно было принять.

Пример: Отправка уведомления с использованием SNS через 10 минут после выполнения лямбда-функции.

Ответы [ 4 ]

0 голосов
/ 07 июля 2018

Я думаю, что самый простой способ сделать это с помощью AWS Step Functions. Вы можете либо -

  1. Настройка шагового станка, состоящего из функции A, состояния ожидания, функции B.
  2. Вызовите шаговый станок из функции A, который будет состоять из состояния ожидания и функции B (если вы хотите иметь задержку с начала функции A).
0 голосов
/ 06 июля 2018

Самый простой способ - использовать SQS с задержкой доставки.

  1. Lambda-A добавляет сообщение в очередь SQS и устанавливает задержку доставки в 10 минут. Вы можете установить любую задержку от 0 до 15 минут. Вы также можете использовать SQS Delay Queues, чтобы задержать все сообщения, добавленные в очередь. https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

  2. Через 10 минут сообщение SQS становится видимым, и SQS запускает Lambda-B.

  3. 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"
    }
]
0 голосов
/ 06 июля 2018

Вы, вероятно, могли бы достичь того, что искали, используя таймеры сообщений в SQS .

Функция A должна опубликовать сообщение в очереди с 10-минутной задержкой, а функция B должна подписаться на очередь.

0 голосов
/ 06 июля 2018

Да, вы можете сделать это, используя SQS Delay Queues для запуска лямбды B.

Выполните следующие действия

Создайте очередь SQS с задержкой сообщения, установленной на 10 минут. УстановитьТриггер лямбды B, как указано выше SQS Теперь, после выполнения лямбда-функции A, поместите сообщение в SQS

Теперь, поскольку для SQS задана задержка, сообщение будет доступно через 10 минут, и как только оно станет доступным, оно активирует лямбдуB

...