如何在aws s3存储桶中删除具有相同密钥的多个对象

时间:2018-05-08 09:09:21

标签: javascript amazon-s3 aws-lambda aws-sdk prisma

TLDR;如何使用与原始图像相同的密钥删除s3子文件夹中的图像副本?

我有一台prisma服务器,并通过prisma后端将我的应用程序中的图像上传到我的s3存储桶。此外,如果需要,我运行lambda函数来动态调整这些图像的大小。

这是lambda函数的过程

  • 用户通过其静态请求来自S3存储桶的已调整大小的资产 网站托管端点。存储桶具有配置为的路由规则 重定向到resize API对无法对象的任何请求 找到。
  • 因为调整后的资产不存在于存储桶中,所以 请求暂时重定向到resize API方法。
  • 用户的浏览器遵循重定向并通过API网关请求调整大小操作。
  • API网关方法配置为触发a Lambda函数用于处理请求。
  • Lambda函数下载 来自S3存储桶的原始图像,调整其大小并上传 将图像重新调整为最初请求的密钥。
  • 当Lambda函数完成时,API Gateway会永久重定向 用户存储在S3中的文件。
  • 用户的浏览器请求 来自S3存储桶的现在可用的已调整大小的图像。
  • 后续请求 从此和其他用户将直接从S3和旁路服务 调整大小的操作。
  • 如果将来删除已调整大小的图像, 重复上述过程并重新创建重新调整大小的图像 换成S3桶。

https://aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/

这让我想到以下问题: 每当我在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!')
}

2 个答案:

答案 0 :(得分:1)

我之前做过类似的事情。我们将path/to/my/image/11222333.jpg中的图像和path/to/my/image/11222333/200x200.jpg中的图像存储起来。因此,当删除112233.jpg时,我们只需要列出文件夹中的所有再现并删除它们。

答案 1 :(得分:0)

因为我只允许调整某些分辨率的大小,所以我最终做了以下事情:

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
    }
  }

如果有更优雅的方式,请告诉我。 :)