【问题标题】:How to delete multiple objects with the same key in aws s3 bucket如何在aws s3存储桶中删除具有相同键的多个对象
【发布时间】:2018-10-18 04:34:30
【问题描述】:

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

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

这里是lambda函数的过程

  • 用户通过其静态资源从 S3 存储桶请求调整大小的资产 网站托管端点。存储桶有一个路由规则配置为 重定向到调整大小 API 对无法被调整的对象的任何请求 成立。
  • 由于存储桶中不存在调整大小的资产, 请求被临时重定向到 resize API 方法。
  • 用户浏览器跟随重定向,通过 API Gateway 请求调整大小操作。
  • API 网关方法配置为触发 用于处理请求的 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!')
}

【问题讨论】:

  • 对象键是full/path/prefix/filename.ext。删除 filename.ext 会从存储桶的根目录中删除该名称的文件。如果要删除其他文件,则需要传递它们的整个对象键,因为 filename.ext 本身 only 指向具有该键的对象——而不是任何其他类似名称的对象,因为它们的对象键实际上并不“相同”。你问的是这个吗?
  • @Michael-sqlbot 我明白了。我想知道如何对与正在删除的原始文件相关的所有调整大小的图像进行某种级联删除。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我之前做过类似的事情。我们存储了像path/to/my/image/11222333.jpg这样的图像和path/to/my/image/11222333/200x200.jpg中的演绎版所以当删除112233.jpg时我们只需要列出文件夹内的所有演绎版并删除它们。

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2021-01-03
      • 1970-01-01
      • 2015-12-02
      • 2020-05-12
      相关资源
      最近更新 更多