Загрузка медиа на AWS с данными - Lambda и S3

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

В настоящее время пользователь отправляет POST запрос к API-шлюзу, который вызывает функцию Lambda, которая вставляет данные поста в базу данных. Это прекрасно работает. API Gateway использует отображение тела для форматирования данных события.

Кажется, у меня есть три варианта загрузки медиафайлов:

  1. Сделать HTTP POST как обычно, запросите ЗАГРУЗИТЬ носитель на S3 (через Cloudfront?).

    • S3 запускает функцию Lambda, которая обновляет запись записи с помощью URL-адреса носителя.
    • Для этого потребуется по крайней мере 2 вызова API на веб-интерфейсе. -.-
    • Что делать, если загрузка медиа не удалась? Я должен был бы вызвать другую функцию Lambda, чтобы удалить сообщение. Что если это не удастся? Это кроличья нора.
  2. Загрузите медиа на S3 (через Cloudfront?), Затем сделайте HTTP POST запрос.

    • Для этого потребуется 2 вызова API на веб-интерфейсе. -.-
    • Что делать, если POST запрос не проходит? У меня были бы дополнительные предметы в моем ведре. Я полагаю, у меня может быть запланированная задача очистки ведра, но угг.
    • Будет ли ключ S3 не соответствовать id поста? (id генерируется при вставке базы данных.)
  3. Загрузите медиа с HTTP POST запрос в multipart/form,

    • Вот как я делал это в прошлом, но у меня также был веб-сервер (не лямбда). Если фотография не очень большая, переход на S3 должен быть относительно быстрым, и моя стоимость лямбды не увеличится слишком сильно. Но что, если я решу добавить видео? Теперь мои лямбда-вызовы будут длиться секунды.

Какова лучшая практика здесь? Это кажется распространенной проблемой, но все руководства, которые я нашел в Интернете, не касаются почтовых данных (только медиа-данные).

1 ответ

Решение

(Из комментариев)

Ваши объекты состоят из двух одинаково важных частей (текста и носителя), и вы хотите перенести их в одну операцию, чтобы избежать проблем согласованности.

Если вы можете ограничить свой текст менее чем 1024 символами Юникода: поместите текст в ключ объекта s3, содержащего ваши медиа. Вам нужно зарезервировать некоторые символы в начале клавиши, т. Е. До того, как начнется текст пользователя, потому что в ListObjects API S3 есть полезный параметр "Префикс", и вы можете сделать свои префиксы подходящими для поиска. Затем подключите лямбда-слушатель, чтобы создать запись в БД после загрузки.

Если ваши сообщения содержат более 1000 с лишним символов: тогда да, вам нужно две операции и процесс очистки, чтобы найти те, которые потерпели неудачу. Истечение срока действия объекта S3 должно помочь очистить часть мультимедиа, которую вы будете загружать первой (ваш вариант №2), вы, конечно, переместите носитель из корзины с автоматическим истечением при успешной отправке части текста в своем сообщении.

Рад помочь

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