【问题标题】:How to know whether lambda image compression is completed?如何知道lambda图像压缩是否完成?
【发布时间】:2021-07-28 10:37:33
【问题描述】:

我正在使用 apollo-server-express 制作 GraphQL API 服务器。

为了允许用户将他们的图片上传到 S3,我做了一个名为 userContentFileUpload Mutation 的突变,其架构如下所示:

type Mutation {
  userContentFileUpload(file: File!) {
    uploadUrl
    fileUrl
  }
}

uploadUrl 是一个预签名的 S3 URL,用于上传图像文件,fileUrl 是一个 S3 URL,包括上传的图像文件将拥有的密钥。

因此客户端可以按如下方式使用此 API:

  1. 使用fetchaxios 将图像文件上传到uploadUrl
  2. 等待上传请求成功。
  3. 使用fileUrl 作为上传文件的远程 URL。

现在我正在尝试添加一个压缩上传图像的 AWS lambda 函数。

lambda 函数将:

  1. 由 S3 文件上传事件触发。
  2. 压缩上传的文件。
  3. 将压缩文件放入 S3 存储桶。

但是,由于对uploadUrl的上传请求将在lambda函数的第1步之前完成,因此客户端开始使用fileUrl的时间与压缩文件实际放入的时间之间会有差距S3 存储桶。

我该如何填补这个空白??

【问题讨论】:

  • 我能问一下您在上传图片的元数据中获得的内容类型是什么?是二进制/八位字节流还是图像/png?

标签: amazon-s3 aws-lambda image-compression


【解决方案1】:

据我所知,您现在有两个常规选项:

  1. 在收到图像时对其进行压缩(称为静态再现)。
  2. 交付时压缩图像并缓存结果(有时称为动态再现)。

这是您在所有资产交付系统中拥有的两个选项。这两种方法各有优缺点。

由于您没有提供很多细节(图片大小、使用模式等),很难说两者中哪一个更适合您。

因此,我只会提示您如何在 AWS 中实现这两者。

如果您想在收到图像时对其进行压缩,并且只希望在图像被压缩时允许访问fileUrl,您可以切换到Step Functions。几个月以来API Gateway allows you to send incoming requests directly to express Step Functions进行处理。因此,您可以创建一个 Step Function 来下载图像,创建压缩版本,然后返回给调用者。显然,这是有局限性的。图片越大,处理时间越长,您可能会超时运行等。所以上传 2MB 的图片,没问题。上传 1GB 大的图片,这可能会成为问题。

您的第二个选项是在交付时压缩并缓存结果。如果您使用AWS Cloudfront, you can use Lambda@Edge 来执行此操作。但你也可以使用S3 Object Lambdas

您可能还有更多选择可以构建这样的东西。但是如果没有更多细节,很难找到最适合您的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2011-09-12
    • 2014-05-08
    • 2020-02-06
    相关资源
    最近更新 更多