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

Use Lambda Edge(with Cloudfront trigger) to resize images on fly

我刚刚完成了此操作,使存储在 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

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

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

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

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

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

截至 2017 年 12 月,AWS Lambda Limits are memory allocation maximum of 3008 MB and maximum execution duration per request of 300 seconds. In fact Step 2.1: Create a Deployment Package 甚至使用了图像调整大小的示例。

AWS Lambda@Edge has the best description of the events including a diagram. I think you want to use the Origin Request event, so your response can be cached. Also, watch AWS re:invent 2017: Building Serverless Websites with Lambda@Edge (CTD309) - YouTube 以获得完整的解释。

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

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

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