【问题标题】:How to remove the corresponding thumbnails from subdirectories in case the image was deleted from the S3 bucket root?如果图像从 S3 存储桶根目录中删除,如何从子目录中删除相应的缩略图?
【发布时间】:2017-12-24 03:06:41
【问题描述】:

我将 AWS S3 服务用于媒体目的,同时将 AWS Lamda 服务用于与拇指相关的图像。

面临以下问题:如果我删除主目录中的媒体,则缩略图(由 Lambda 生成)将仍然存在于子目录中。

例如: 如果我从 Node.js 代码中删除“1513928090496_juCQtDAt6ylr.jpg”文件,那么我还需要从“100x100”、“1920x720”和“300x300”目录中删除相同的文件。 (它们还包含相同的文件“1513928090496_juCQtDAt6ylr.jpg”)

更多详情请参考上传的图片。

【问题讨论】:

标签: javascript node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

最简单的方法是使用另一个 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 控制台中设置触发器(转到您的 Lambda -> 配置):

您还应确保您的 Lamda 角色具有允许其从存储桶中删除对象的策略。

就我而言,我添加了这样的内联策略:

因此它生成了以下策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:DeleteObject",
            "Resource": [
                "arn:aws:s3:::thumbnails-bucket-123",
                "arn:aws:s3:::*/*"
            ]
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 2021-01-20
    • 2011-09-12
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多