使用 Lambda Edge(带有 Cloudfront 触发器)动态调整图像大小

Posted

技术标签:

【中文标题】使用 Lambda Edge(带有 Cloudfront 触发器)动态调整图像大小【英文标题】:Use Lambda Edge(with Cloudfront trigger) to resize images on fly 【发布时间】:2018-03-27 19:50:34 【问题描述】:

我刚刚完成了这项工作,可以根据要求调整存储在 s3 上的图像的大小,并且它可以作为魅力:https://aws.amazon.com/tw/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/

我刚刚开始阅读 Lambda Edge 的文章:http://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html

但我仍然不确定应该如何处理事件:查看器请求、源请求、源响应和查看器响应。

我现在使用的带网关触发器的 lambda 函数是https://github.com/awslabs/serverless-image-resizing

【问题讨论】:

【参考方案1】:

目前,Lambda@Edge 不太适合调整图像大小。它适用于更轻量级的任务,例如标题操作和基于文本的小型响应生成。

在 Lambda@Edge 中,部署 zip 文件限制为 1 MiB,容器内存限制为 128 MiB,运行时在查看器端限制为 1 秒,在源端限制为 3 秒,虽然可用CPU 容量没有明确公布,它只是 1 个现代 2.3-2.4 GHz Xeon 内核容量的一小部分。亚毫秒级的标题重写就足够了,但图像大小调整就足够了。

既然 Lambda@Edge 能够检查查询字符串,您可以使用它而不是 API Gateway 来调用第二个实际执行调整大小的 Lambda 函数(从 Lambda 调用 Lambda)然后转换从 API Gateway 格式到 CloudFront 格式的响应,因此每次调用的成本可能会更低(因为 Lambda@Edge 请求的成本低于 API Gateway 请求)......但它不能直接替代 API Gateway + Lambda正在做的既定例子。您可以使用 Origin Request 触发器来执行此操作。

Lambda@Edge 也无法返回生成的二进制内容(仅 UTF-8 字符内容),尽管这与实施的调整大小示例没有直接关系,因为重定向用于将浏览器发送到新的目标对象。

非常有用,但不完全等同于 API Gateway + Lambda。

【讨论】:

【参考方案2】:

截至 2017 年 12 月,AWS Lambda Limits 的内存分配最大值为 3008 MB,每个请求的最长执行持续时间为 300 秒。事实上Step 2.1: Create a Deployment Package 甚至使用了图片缩放的例子。

AWS Lambda@Edge 有最好的事件描述,包括图表。我认为您想使用 Origin Request 事件,因此可以缓存您的响应。另外,请观看AWS re:invent 2017: Building Serverless Websites with Lambda@Edge (CTD309) - YouTube 以获得完整说明。

【讨论】:

【参考方案3】:

现在,Lambda@edge 已经支持几十 MB 的压缩包。所以我们可以将sharp库打包进去,支持我们对图片的常规处理。

我写了一个最佳实践。 https://github.com/foamzou/aws-lambda-edge-image-process

使用它,用户只需要添加几个参数就可以得到处理后的图片。例如将jpg图片转换为宽度为500px、质量为50%的webp图片:https://your-cdn/image.jpg@500w_50q.webp

【讨论】:

以上是关于使用 Lambda Edge(带有 Cloudfront 触发器)动态调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 lambda@edge 调整图像大小时修复访问被拒绝错误

使用 Lambda@Edge 在边缘站点自定义内容

Lambda@edge 实现负载均衡器功能

在 NodeJS 中使用 Lambda@Edge 对 CloudFront 进行基本 HTTP 身份验证

带有 lambda 比较器错误的 C++ priority_queue

AWS lambda 和 AWS Lambda@EDGE 有啥区别?