Выполнить лямбда-функцию для нескольких файлов в S3 - PullRequest
0 голосов
/ 04 июня 2019

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

  1. Файлы добавляются случайным образом в корзину S3; по частям или через случайные интервалы
  2. Лямбда-функция запускается, когда 9 файлов находятся в корзине S3; лямбда-функция обрабатывает или объединяет эти файлы вместе.
  3. После обработки файлы будут перемещены в другое ведро или удалены.

Вот что я пробовал:

  • У меня есть триггеры S3 для всех ставок S3
  • В моей лямбда-функции я игнорирую само имя файла и перечисляю корзину S3 на основе ключа, чтобы подсчитать, сколько файлов существует
  • проблема в том, что трафик загружен или приходит стабильно, но в быстром темпе трудно идентифицировать уникальные группы из 9 файлов
  • У меня есть префиксы uuid в именах файлов по соображениям производительности, поэтому последовательных имен файлов не существует.
  • Я подумал о записи метаданных в базу данных nosql, но пока не пошел по этому пути.

1 Ответ

0 голосов
/ 04 июня 2019

Одним из возможных решений является использование запланированной лямбды (может быть настолько частой или разреженной, насколько вы хотите, основываясь на вашем трафике), которая извлекает события из очереди SQS, заполненной событиями S3 put. Предполагается, что вы сосредоточены на пакетной обработке n файлов за раз, и порядок не имеет значения (с учетом имени uuid).

Для создания этого рабочего процесса было бы что-то вроде этого:

  1. Создать очередь SQS для хранения событий S3 PUT
  2. Добавить триггер к корзине S3 на PUT, чтобы создать событие в очереди SQS из 1.
  3. Создать лямбду с переменными env (для корзины и очереди)
    1. Лямбда должна проверить очередь, если есть какие-либо сообщения в полете и использовать только ведро
    2. Если есть, остановить запуск (чтобы предотвратить многократную обработку файла)
    3. Если в полете нет сообщений, перечислите объекты из S3 с пределом n (размер вашей партии)
    4. Запустить логику процесса, если возвращено достаточно объектов (может быть меньше n)
    5. Удалить файлы
  4. Создать правило CloudWatch для запуска лямбды каждые n секунд / минут / часов

Некоторые другие вещи, которые следует учитывать, исходя из особенностей вашей ситуации:

  • Если быстро отправляется много файлов, а n значительно меньше, обработка с одним отслеживанием (шаг 3.2 приведет к длительному времени обработки). Это также зависит от продолжительности обработки, могут ли данные обрабатываться несколько раз и т. Д.
  • ListObjectsV2 может вернуть меньше параметра MaxKeys, если это проблема, может иметь большее значение MaxKeys и просто обработать первый n.
...