Как удалить несколько объектов с одним и тем же ключом в контейнере aws s3 - PullRequest
0 голосов
/ 08 мая 2018

TLDR; Как я могу удалить реплики изображений в подпапках s3 с тем же ключом, что и исходное изображение?

У меня есть сервер призмы, и я загружаю изображения из моего приложения в мое хранилище s3 через серверную часть призмы. Кроме того, я запускаю лямбда-функцию для изменения размера этих изображений на лету, если требуется.

Вот процесс лямбда-функции

  • Пользователь запрашивает ресурс с измененным размером из корзины S3 через его статический конечная точка хостинга сайта. Ведро имеет правило маршрутизации, настроенное на перенаправить в API изменения размера любой запрос на объект, который не может быть найденный.
  • Поскольку актив с измененным размером не существует в корзине, запрос временно перенаправлен в метод API изменения размера.
  • Браузер пользователя выполняет перенаправление и запрашивает операцию изменения размера через API-шлюз.
  • Метод API Gateway настроен для запуска Лямбда-функция для обслуживания запроса.
  • Загрузка лямбда-функции исходное изображение из корзины S3, изменяет его размеры и загружает изменил размер изображения обратно в корзину как первоначально запрошенный ключ.
  • Когда лямбда-функция завершается, API-шлюз перенаправляет навсегда пользователь к файлу хранится в S3.
  • Браузер пользователя запрашивает теперь доступно измененное изображение из корзины S3.
  • Последующие запросы от этого и других пользователей будут обслуживаться напрямую из S3 и обходить операция изменения размера.
  • Если изображение с измененным размером будет удалено в будущем, вышеуказанный процесс повторяется, и изображение с измененным размером воссоздается и заменено в ведро S3.

https://aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/


Это подводит меня к следующей проблеме: Всякий раз, когда я удаляю узел изображения с ключом в Prisma, я могу удалить объект с тем же ключом из aws s3, но я не буду касаться его реплик с измененным размером в подпапках соответствующих разрешений. Как мне этого добиться? Я попытался использовать aws deleteObjects (), передав только один ключ, как показано ниже. Тем не менее, это только удаляет исходное изображение в корне корзины.

Вот реализация лямбда-функций

exports.processDelete = async ( { id, key }, ctx, info) => {

  const params = {
    Bucket: 'XY',
    Delete: {
      Objects: [
        {
          Key: key, 
        },
      ],
      Quiet: false
    }
  }

  // Delete from S3
  const response = await s3
    .deleteObjects(
      params,
      function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
      }
    ).promise()

  // Delete from Prisma
  await ctx.db.mutation.deleteFile({ where: { id } }, info)

  console.log('Successfully deleted file!')
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Я сделал что-то похожее время назад.Мы сохранили изображения типа path/to/my/image/11222333.jpg и изображения в path/to/my/image/11222333/200x200.jpg Так что при удалении 112233.jpg нам просто нужно перечислить все представления внутри папки и удалить их.

0 голосов
/ 08 мая 2018

Поскольку я разрешаю изменение размеров только определенных разрешений, в итоге я сделал следующее:

exports.processDelete = async ( { id, key }, ctx, info) => {
  const keys = [
    '200x200/' + key,
    '293x293/' + key,
    '300x300/' + key,
    '400x400/' + key,
    '500x500/' + key,
    '600x600/' + key,
    '700x700/' + key,
    '800x800/' + key,
    '900x900/' + key,
    '1000x1000' + key,
  ]

  const params = {
    Bucket: 'XY',
    Delete: {
      Objects: [
        {
          Key: key, 
        },
        {
          Key: keys[0], 
        },
        {
          Key: keys[1], 
        },
        {
          Key: keys[2], 
        },
        {
          Key: keys[3], 
        },
        {
          Key: keys[4], 
        },
        {
          Key: keys[5], 
        },
        {
          Key: keys[6], 
        },
        {
          Key: keys[7], 
        },
        {
          Key: keys[8], 
        },
        {
          Key: keys[9], 
        },
      ],
      Quiet: false
    }
  }

Если есть более элегантный способ, пожалуйста, дайте мне знать. :)

...