如何删除aws s3 bucket中具有相同键的多个对象
How to delete multiple objects with the same key in aws s3 bucket
TLDR;如何使用与原始图像相同的密钥删除 s3 子文件夹中的图像副本?
我有一个 prisma 服务器,可以通过 prisma 后端将我的应用程序中的图像上传到我的 s3 存储桶。此外,我 运行 一个 lambda 函数,可以根据需要即时调整这些图像的大小。
这里是lambda函数的过程
- 用户通过其静态请求从 S3 存储桶中调整大小的资产
网站托管端点。桶有一个路由规则配置为
重定向到调整大小 API 任何对对象的请求不能
成立。
- 因为桶中不存在调整大小的资产,
请求暂时重定向到 resize API 方法。
- 用户的浏览器遵循重定向并通过 API 网关请求调整大小操作。
- API 网关方法配置为触发
Lambda 函数来处理请求。
- Lambda 函数下载
S3 存储桶中的原始图像,调整大小,然后上传
将图像重新调整大小作为最初请求的密钥放回存储桶中。
- Lambda 函数完成后,API 网关永久重定向
用户访问存储在 S3 中的文件。
- 用户的浏览器请求
来自 S3 存储桶的现已调整大小的图像。
- 后续请求
来自这个和其他用户的用户将直接从 S3 获得服务并绕过
调整大小操作。
- 如果以后删除调整大小后的图片,
重复上述过程并重新创建调整大小的图像并
替换到 S3 存储桶中。
这让我想到了以下问题:
每当我在 Prisma 中删除一个带有键的图像节点时,我都可以从 aws s3 中删除具有相同键的对象,但我不会在相应分辨率的子文件夹中触摸它的调整大小的副本。我怎样才能做到这一点?我尝试通过仅传递一个键来使用 aws 的 deleteObjects() ,如下所示。但是,这只会删除存储桶根部的原始图像。
这是 lambda 函数的实现
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!')
}
因为我只允许调整某些分辨率的大小,所以我最终执行了以下操作:
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 时,我们只需要列出文件夹内的所有演绎版并将它们删除。
TLDR;如何使用与原始图像相同的密钥删除 s3 子文件夹中的图像副本?
我有一个 prisma 服务器,可以通过 prisma 后端将我的应用程序中的图像上传到我的 s3 存储桶。此外,我 运行 一个 lambda 函数,可以根据需要即时调整这些图像的大小。
这里是lambda函数的过程
- 用户通过其静态请求从 S3 存储桶中调整大小的资产 网站托管端点。桶有一个路由规则配置为 重定向到调整大小 API 任何对对象的请求不能 成立。
- 因为桶中不存在调整大小的资产, 请求暂时重定向到 resize API 方法。
- 用户的浏览器遵循重定向并通过 API 网关请求调整大小操作。
- API 网关方法配置为触发 Lambda 函数来处理请求。
- Lambda 函数下载 S3 存储桶中的原始图像,调整大小,然后上传 将图像重新调整大小作为最初请求的密钥放回存储桶中。
- Lambda 函数完成后,API 网关永久重定向 用户访问存储在 S3 中的文件。
- 用户的浏览器请求 来自 S3 存储桶的现已调整大小的图像。
- 后续请求 来自这个和其他用户的用户将直接从 S3 获得服务并绕过 调整大小操作。
- 如果以后删除调整大小后的图片, 重复上述过程并重新创建调整大小的图像并 替换到 S3 存储桶中。
这让我想到了以下问题: 每当我在 Prisma 中删除一个带有键的图像节点时,我都可以从 aws s3 中删除具有相同键的对象,但我不会在相应分辨率的子文件夹中触摸它的调整大小的副本。我怎样才能做到这一点?我尝试通过仅传递一个键来使用 aws 的 deleteObjects() ,如下所示。但是,这只会删除存储桶根部的原始图像。
这是 lambda 函数的实现
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!')
}
因为我只允许调整某些分辨率的大小,所以我最终执行了以下操作:
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 时,我们只需要列出文件夹内的所有演绎版并将它们删除。