在Amazon S3上保存图像并使用CloudFront分发图像的最佳方法

时间:2017-02-12 12:35:13

标签: node.js amazon-s3 amazon-cloudfront image-scaling

我正在处理的应用程序(nodejs)具有用户配置文件,每个配置文件可以有多个图像。我使用S3作为我的主存储,使用CloudFront来分发它们。

有时候用户会上传大图片,而我想要做的就是在下载图片时进行缩放(在html img标签或手机中查看)主要是因为性能。

我不知道是否应该在将图像上传到S3之前缩放图像(可能使用lwip https://github.com/EyalAr/lwip),或者是否有一种缩放图像或在下载时获得低质量图像的方法CloudFront的?我已经读过CloudFront可以使用Gzip压缩文件,但也不建议用于图像。

由于存储原因,我也不想将缩放后的原始图片上传到S3。

应该在客户端,服务器还是S3中完成?这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

  

有没有办法在通过CloudFront下载图像或获得低质量图像?

没有这样的功能。如果您希望图像调整大小,重新采样,缩放,压缩等,则需要先将其保存到S3中的最终位置。

请注意,我在S3中说出最终位置。

一种解决方案是将图像上传到S3中的中间位置,可能在另一个存储桶中,然后使用修改图像的代码调整图像大小并将其存储在最终的S3位置,从而CloudFront将代表下载用户获取它。

  

我已经读过CloudFront可以使用Gzip压缩文件,但也不推荐用于图像。

图像从gzip压缩中获益很少,但CloudFront文档也指出了CloudFront doesn't compress anything that isn't in some way formatted as text,它往往会从gzip压缩中获益更多。

  

由于存储,我也不想将缩放的+原始图像上传到S3。

我相信这是你的错误。

“压缩”图像与压缩zip文件不同。压缩图像是有损。您无法从压缩版本重建原始图像,因为此处讨论的图像压缩(根据定义)是从图像到大小在所需范围内且质量在可接受范围内的有意丢弃信息。 。图像压缩既是科学又是艺术。如果您不保留原始图像,并且您以后决定要修改图像压缩算法(或者因为您后来确定尺寸仍然太大,或者因为您认为原始算法过于激进并导致不可接受的低质量),你不能再通过压缩算法运行已经压缩的图像而不会进一步降低质量。

使用S3的STANDARD_IA(“不常访问”)存储类将原始图像的存储成本减半,以换取更昂贵的下载 - 因为这些图像很少会再次下载,因为只有您将在存储它们的存储桶中知道它们的URL。

  

应该在客户端,服务器还是S3中完成?

无法在“S3”中完成,因为S3仅存储对象。它不会操纵它们。

这留下了两个选项,但在服务器上执行它有多种选择。

当你说“服务器”时,你可能会想到你的网络服务器。这是一个选项,但此过程可能会占用大量资源,因此您需要在可扩展性计划中对其进行说明。

GitHub上有一些项目,如this one,旨在使用AWS Lambda执行此操作,后者根据需要提供“无服务器”代码执行。代码在服务器上运行,但它不是您必须配置或维护的服务器,或者在它不活动时付费 - Lambda以100毫秒的增量计费。这是第二种选择。

在客户端上执行此操作当然是一种选择,但似乎可能更有问题且容易出错,更不用说某些解决方案将是特定于平台的。

没有“最好”的方法来完成这项任务。

如果您不熟悉EXIF元数据,则还需要熟悉它。除了重新采样/调整大小之外,您可能还需要从用户提供的图像中删除一些元数据,以避免泄露用户可能无法识别的敏感数据附加到他们的图像 - 例如照片所在的GPS坐标拍摄。有些网站还会为用户提交的图像添加水印,这也是您可能同时进行的操作。

答案 1 :(得分:0)

我会将图像存储在STANDARD_IA中的S3中,然后使用运行nodejs的Lambda和sharp动态调整它们的大小。谷歌做了类似的事情我相信,因为你可以在任何方面请求你的个人资料img。

AWS Networking& Content Deliver博客有一篇帖子可能会为您提供所需的大量内容。 Check it out here.

基本理念是:

  1. 像往常一样将图像上传到S3(如果需要,可以执行STANDARD_IA以节省成本)
  2. 使用包含所需图像大小的查询参数向Cloudfront发送请求(即https://static.mydomain.com/images/image.jpg?d = 100×100)
  3. 使用Lambda Edge功能,您可以构建已调整大小的图像,并在通过CDN提供之前根据需要将它们存储在s3中。创建调整大小后的版本后,它始终在S3中可用
  4. Cloudfront会返回刚刚创建的新调整大小的图像。
  5. 它的工作量有点多,但它可以根据您的需要为您提供一些适合您想要/需要的尺寸。它还可以让您灵活地随时从UI更改要为客户端提供的img大小。这里有几个类似的帖子..有些甚至不使用Cloudfront,但只是通过ApiGateway作为中间人。

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

    https://github.com/awslabs/serverless-image-resizing