Как узнать, завершено ли сжатие лямбда-изображения?

Я делаю сервер API GraphQL с помощью apollo-server-express.

Чтобы пользователи могли загружать свои изображения на S3, я сделал мутацию под названием userContentFileUpload Mutation, схема которой выглядит так:

type Mutation {
  userContentFileUpload(file: File!) {
    uploadUrl
    fileUrl
  }
}

uploadUrl - это предварительно подписанный URL-адрес S3 для загрузки файла изображения, а fileUrl - URL-адрес S3, включая ключ, который будет иметь загруженный файл изображения.

Таким образом, клиент может использовать этот API следующим образом:

  1. Загрузите файл изображения в uploadUrl, используя fetch или axios.
  2. Подождите, пока запрос на загрузку не будет успешным.
  3. Используйте fileUrl в качестве удаленного URL-адреса загруженного файла.

Теперь я пытаюсь добавить лямбда-функцию AWS, которая сжимает загруженные изображения.

Лямбда-функция:

  1. Запускается событием загрузки файла S3.
  2. Сожмите загруженный файл.
  3. Поместите сжатый файл в корзину S3.

Однако, поскольку запрос на загрузку в uploadUrl будет завершен до шага 1 лямбда-функции, будет промежуток между моментом, когда клиент начинает использовать fileUrl, и временем, когда сжатый файл фактически помещается в корзину S3.

Как я могу восполнить этот пробел ??


person 김승수    schedule 06.05.2021    source источник
comment
Могу я спросить, какой тип контента вы получаете в своих метаданных загруженного изображения? Это двоичный / октетный поток или изображение / png?   -  person KnowledgeGainer    schedule 06.05.2021


Ответы (1)


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

  1. Сжимайте изображение при его получении (так называемое статическое воспроизведение).
  2. Сжимайте изображение при его доставке и кешируйте результат (иногда это называется динамическим воспроизведением).

Это два варианта, которые есть во всех системах доставки активов. Оба подхода имеют свои преимущества и недостатки.

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

Поэтому я просто дам вам подсказки, как и то, и другое можно реализовать в AWS.

Если вы хотите сжать изображение при его получении и хотите разрешить доступ только к fileUrl, когда изображение сжато, вы можете переключиться на Пошаговые функции. Через несколько месяцев API Gateway позволяет вы должны отправлять входящие запросы напрямую в Step Functions для обработки. Таким образом, вы можете создать пошаговую функцию, которая загружает изображение, создает сжатую версию и затем возвращается к вызывающей стороне. Очевидно, у этого есть пределы. Чем больше изображение, тем больше времени может занять обработка, могут возникнуть таймауты и т. Д. Так что загрузка изображений размером 2 МБ - не проблема. Загрузка изображений размером 1 ГБ может стать проблемой.

Второй вариант - сжать при доставке и кэшировать результат. Если вы используете AWS Cloudfront, для этого можно использовать Lambda @ Edge. Но вы также можете использовать Лямбда-выражения объекта S3.

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

person Jens    schedule 06.05.2021