В папку AWS S3 положено уведомление о событии - PullRequest
0 голосов
/ 23 февраля 2019

Я написал функцию на Python, которая загружает папку и ее содержимое на S3.Теперь я хотел бы, чтобы S3 генерировал событие (чтобы я мог отправить его лямбда-функции).S3 позволяет генерировать события только на уровне файлов, фактически папки на s3 являются просто уровнем визуализации, а это означает, что S3 не имеет внутреннего представления для папок, ключи с одним и тем же корнем просто сгруппированы вместе.Тем не менее, на данный момент я предложил три подхода, основанных на идее «ядовитой пилюли».

  1. Отправить специальный файл в конце процесса загрузки папки, создание которого отправляет событие в лямбду, которое может открыть файл для чтения пользовательских директив для действий.Кажется, что этот подход довольно гибкий, однако он создает серьезные проблемы с точки зрения безопасности (я знаю, что ACL существуют по этой причине, но я не совсем уверен, достаточно ли это), и генерирует некоторые издержки при загрузке / загрузке / удалениифайл из / в локальную память.

  2. Сопоставить событие с целевыми лямбдами и запустить его напрямую.Разница в подходах заключается просто в том, что в этом случае я не создаю файл на S3, я просто заставляю S3 в это верить.Я бы использовал CloudWatch для запуска пользовательских событий, созданных S3-объектами, с именем папки, которую лямбда могла бы получить.Этот подход кажется немного более хакерским, чем два других, плюс, когда я проводил исследование по этому вопросу, казалось, что в AWS не должно быть возможности генерировать «фиктивные» события (т. Е. Trigger S3 create event ).Однако, насколько я понимаю, функция put_events должна помочь.

  3. Использование SQS позволило бы поместить имя папки в задачу SQS, которая впоследствии может быть использована лямбда-выражением.Это имеет некоторые преимущества по сравнению с двумя другими подходами, поскольку в SQS теперь есть вариант LIFO, который позволяет выполнять доставку только один раз, обработку сбоев (через очередь недоставленных писем) и т. Д., Однако это создает нетривиальную сложность по сравнению сдругие подходы.

На данный момент я пытаюсь выбрать наиболее «правильный» подход, и для этого я пытаюсь взвесить все за и против, чтобы сделатьобоснованное решение, которое привело меня к некоторым вопросам:

  • Есть ли другой способ, который я пропускаю, чтобы не включать уведомление клиента?(все вышеупомянутые подходы основаны на том, что клиент отправляет уведомление тем или иным способом, что не очень «облачно»)?

  • Существуют ли существенные различия между подходами 2 и 3, если учесть, что оба метода полагаются на отправку информации в и из потока (CloudWatch и SQS соответственно)?

1 Ответ

0 голосов
/ 23 февраля 2019

Я думаю, что ваш вопрос сводится к тому, «как я могу вызвать функцию Lambda после Я загрузил папку, полную файлов, в S3?»

Если у вас нет информации априорина стороне сервера, которую вы можете использовать, чтобы определить, когда загрузка папки завершена, клиенту придется сообщить вам об этом.

Параметры, которые я бы рассмотрел:

  1. изменить ваш клиент, чтобы опубликовать сообщение в SNS или SQS после завершения загрузки в S3.Это сообщение может затем запустить вашу функцию Lambda.
  2. после того, как последний файл был загружен в папку images/dogs/, загрузите объект нулевого размера, ключ которого совпадает с папкой (images/dogs/).Это «файл дозорного».Используйте триггер событий S3 с суффиксом /, чтобы обнаружить загрузку этого объекта «папка» и запустить вашу лямбду.

Я предпочитаю 1-й вариант.Он достигает конечной цели, не приводя к посторонним объектам S3.С помощью SNS вы также можете настроить несколько последующих процессов в ответ на сообщение «Закончена загрузка» (разветвление), если необходимо.

...