Загрузка медиа на AWS с данными - Lambda и S3
Я делаю простое приложение, в котором пользователь может создавать текстовые сообщения и, при желании, включать медиа (изображения только на данный момент, но видео в будущем).
В настоящее время пользователь отправляет POST
запрос к API-шлюзу, который вызывает функцию Lambda, которая вставляет данные поста в базу данных. Это прекрасно работает. API Gateway использует отображение тела для форматирования данных события.
Кажется, у меня есть три варианта загрузки медиафайлов:
Сделать HTTP
POST
как обычно, запросите ЗАГРУЗИТЬ носитель на S3 (через Cloudfront?).- S3 запускает функцию Lambda, которая обновляет запись записи с помощью URL-адреса носителя.
- Для этого потребуется по крайней мере 2 вызова API на веб-интерфейсе. -.-
- Что делать, если загрузка медиа не удалась? Я должен был бы вызвать другую функцию Lambda, чтобы удалить сообщение. Что если это не удастся? Это кроличья нора.
Загрузите медиа на S3 (через Cloudfront?), Затем сделайте HTTP
POST
запрос.- Для этого потребуется 2 вызова API на веб-интерфейсе. -.-
- Что делать, если
POST
запрос не проходит? У меня были бы дополнительные предметы в моем ведре. Я полагаю, у меня может быть запланированная задача очистки ведра, но угг. - Будет ли ключ S3 не соответствовать
id
поста? (id
генерируется при вставке базы данных.)
Загрузите медиа с HTTP
POST
запрос вmultipart/form
,- Вот как я делал это в прошлом, но у меня также был веб-сервер (не лямбда). Если фотография не очень большая, переход на S3 должен быть относительно быстрым, и моя стоимость лямбды не увеличится слишком сильно. Но что, если я решу добавить видео? Теперь мои лямбда-вызовы будут длиться секунды.
Какова лучшая практика здесь? Это кажется распространенной проблемой, но все руководства, которые я нашел в Интернете, не касаются почтовых данных (только медиа-данные).
1 ответ
(Из комментариев)
Ваши объекты состоят из двух одинаково важных частей (текста и носителя), и вы хотите перенести их в одну операцию, чтобы избежать проблем согласованности.
Если вы можете ограничить свой текст менее чем 1024 символами Юникода: поместите текст в ключ объекта s3, содержащего ваши медиа. Вам нужно зарезервировать некоторые символы в начале клавиши, т. Е. До того, как начнется текст пользователя, потому что в ListObjects API S3 есть полезный параметр "Префикс", и вы можете сделать свои префиксы подходящими для поиска. Затем подключите лямбда-слушатель, чтобы создать запись в БД после загрузки.
Если ваши сообщения содержат более 1000 с лишним символов: тогда да, вам нужно две операции и процесс очистки, чтобы найти те, которые потерпели неудачу. Истечение срока действия объекта S3 должно помочь очистить часть мультимедиа, которую вы будете загружать первой (ваш вариант №2), вы, конечно, переместите носитель из корзины с автоматическим истечением при успешной отправке части текста в своем сообщении.
Рад помочь