AWS Lambda@edge。如何从 S3 读取 HTML 文件并将内容放入响应正文

AWS Lambda@edge. How to read HTML file from S3 and put content in response body

具体来说,在原始响应触发函数中(例如,状态为 404),我如何读取存储在 S3 中的 HTML 文件并将其内容用于响应主体?

(我想像 CloudFront 一样手动 return 自定义错误页面,但根据 cookie 选择它)。

注意:S3 中的 HTML 文件存储在我网站的同一个存储桶中。已启用 OAI。

非常感谢!

Lambda@Edge 函数目前¹ 无法直接访问源中的任何正文内容。

您需要授予您的 Lambda 执行角色必要的权限以从存储桶中读取数据,然后使用 s3.getObject() from the JavaScript SDK 从存储桶中获取对象,然后使用其主体。

SDK 已在环境中²,因此您无需将其与您的代码捆绑在一起。您可以只需要它,并在处理程序外部全局创建 S3 客户端,这样可以节省后续调用的时间。

'use strict';
const AWS = require('aws-sdk');
const s3 = new AWS.S3({ region: 'us-east-2' }); // use the correct region for your bucket

exports.handler ...

请注意,人们认为更新 Lambda@Edge 函数的麻烦之一是 Lambda 控制台给人的印象是重新部署它非常复杂......但您不必使用 Lambda 控制台来执行此操作. "enable trigger and replicate" 复选框的措辞给你的印象是它在做一些重要的事情,但事实证明......它不是。更改 CloudFront 配置中的版本号并保存更改可达到相同的目的。

创建函数的新版本后,您只需转到 CloudFront 控制台中的缓存行为并编辑触发器 ARN 以使用新版本号,然后保存更改。


¹目前,但我已将此作为功能请求提交;这可能允许响应触发器接收响应主体的副本并重写它。它必须限制在 Lambda API 的最大大小(或更小,因为生成的响应当前是有限的),并且在这种情况下可能不适用,因为我假设您可能正在获取特定于语言的响应.

²已经在环境中。如果我没记错的话,很久以前,Lambda@Edge 不包含 SDK,但现在它一直存在。