TLDR;如何使用与原始图像相同的密钥删除 s3 子文件夹中的图像副本?
我有一个 prisma 服务器,并通过 prisma 后端将图像从我的应用程序上传到我的 s3 存储桶。此外,如果需要,我会运行一个 lambda 函数来即时调整这些图像的大小。
这是lambda函数的过程
- 用户通过其静态网站托管端点从 S3 存储桶请求调整大小的资产。存储桶有一个路由规则,配置为将任何对找不到对象的请求重定向到调整大小 API。
- 由于存储桶中不存在调整大小的资产,因此请求会暂时重定向到调整大小 API 方法。
- 用户的浏览器跟随重定向并通过 API Gateway 请求调整大小操作。
- API Gateway 方法配置为触发 Lambda 函数来处理请求。
- Lambda 函数从 S3 存储桶下载原始图像,调整其大小,然后将调整大小的图像作为最初请求的密钥上传回存储桶。
- 当 Lambda 函数完成时,API Gateway 将用户永久重定向到存储在 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!')
}