Запускать лямбду на каждой записи DynamoDb по расписанию?

Есть ли способ запустить лямбду на каждой записи таблицы DynamoDb?

У меня есть таблица "Динамо" с именем, фамилией, адресом электронной почты и лямбда, которая принимает имя, фамилию, адрес электронной почты в качестве параметров. Я пытаюсь настроить среду таким образом, чтобы Lambda каждый день автоматически запускалась для каждого значения, которое она находит в Dynamo; не может сделать все записи в одной лямбде, так как она не будет масштабироваться (истечет время ожидания после добавления новых пользователей).

В настоящее время у меня настроено правило CloudWatch, которое запускает лямбду по расписанию, но мне пришлось вручную добавлять параметры в триггер из "Динамо" - он не автоматический и не динамический / не подключен к динамо.

-

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

Хотелось бы получить дополнительную информацию о любом из этих подходов!

3 ответа

Решение

Есть ли способ запустить лямбду на каждой записи таблицы DynamoDb?

Для вашего конкретного случая, когда все, что вы хотите сделать, это обрабатывать каждую строку таблицы DynamoDB в масштабируемом режиме, я бы попробовал использовать разветвление Lambda -> SQS -> Lambdas следующим образом:

  1. Установите правило событий CloudWatch, которое запускается по расписанию. Иметь это вызвать dispatch Лямбда-функция.

  2. dispatch Работа лямбда-функции заключается в чтении всех записей в вашей таблице DynamoDB и записи сообщений в jobs Очередь SQS, по одному на элемент DynamoDB.

  3. Создать worker Лямбда-функция, которая делает все, что вы хотите, с любым данным элементом из таблицы DynamoDB.

  4. Подключите worker Лямбда к jobs Очередь SQS, чтобы ее экземпляр отправлялся всякий раз, когда что-то помещалось в очередь.

Поскольку ограничивающим фактором являются лямбда-тайм-ауты, запустите несколько лямбда-выражений, используя пошаговые функции. Выполните постраничное сканирование таблицы; каждая лямбда вернет LastEvaluatedKey и передать его следующему вызову для следующей страницы.

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

Потоки - это упорядоченная запись изменений, которые происходят с таблицей. Они могут вызывать лямбду, поэтому она автоматическая (однако помните, что изменение появляется только один раз в потоке, настройте DLQ на случай, если ваша лямбда выйдет из строя). Этот подход хорошо масштабируется и также достаточно эволюционируем. При необходимости вы можете передать события из потока в SQS или Kinesis, разветвить и т. Д., В зависимости от требований.

Другие вопросы по тегам