Как удалить несколько объектов с одним и тем же ключом в контейнере aws s3

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

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

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

  • Пользователь запрашивает ресурс с измененным размером из корзины S3 через свою статическую конечную точку хостинга веб-сайта. В контейнере есть правило маршрутизации, настроенное на перенаправление в API изменения размера любого запроса на объект, который не может быть найден.
  • Поскольку ресурс с измененным размером не существует в сегменте, запрос временно перенаправляется в метод API изменения размера.
  • Браузер пользователя выполняет перенаправление и запрашивает операцию изменения размера через API-шлюз.
  • Метод API-шлюза настроен на запуск лямбда-функции для обслуживания запроса.
  • Функция Lambda загружает исходное изображение из корзины 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 ответа

Решение

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

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
    }
  }

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

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

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