我正在将AWS S3服务用于媒体目的,并将AWS Lambda服务用于与拇指相关的图像。
面对以下问题:如果我删除主目录中的媒体而不是缩略图(由Lambda生成)仍将存在于子目录中。
例如:如果我从Node.js代码中删除“1513928090496_juCQtDAt6ylr.jpg”文件,我还需要从“100x100”,“1920x720”和“300x300”目录中删除相同的文件。 (它们也包含相同的文件“1513928090496_juCQtDAt6ylr.jpg”)
最简单的方法是使用另一个Lambda函数。从桶中删除对象时,可以触发它的执行。
然后,该函数将分析删除的对象是否位于根目录中,如果是,则从子文件夹中删除缩略图。
这是您可以使用的功能:
const AWS = require("aws-sdk");
const s3 = new AWS.S3();
const thumbnailFolders = ["100x100", "1920x720", "300x300"];
exports.handler = function(event, context, callback) {
const bucketName = event.Records[0].s3.bucket.name;
const deletedFileKey = event.Records[0].s3.object.key;
// If there are no forward slashes the file was in the root folder.
const wasInRootDirectory = !deletedFileKey.includes("/");
if (!wasInRootDirectory) {
// If if was not in the root foler, ignore it.
return;
}
const thumbnailsToDelete = thumbnailFolders.map(f => {
return { Key: `${f}/${deletedFileKey}` };
});
const params = {
Bucket: bucketName,
Delete: {
Objects: thumbnailsToDelete
}
};
s3.deleteObjects(params, (err, data) => {
if (err) {
console.log(err, err.stack);
callback(err);
return;
}
//Deleted successfully
callback();
});
};
要在删除对象时运行lambda,您需要在AWS Console中设置触发器(转到Lambda - >配置):
此外,您应确保您的Lamda角色具有允许其从存储桶中删除对象的策略。
在我的情况下,我添加了这样的内联策略:
所以它产生了以下政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:DeleteObject",
"Resource": [
"arn:aws:s3:::thumbnails-bucket-123",
"arn:aws:s3:::*/*"
]
}
]
}