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