具体来说,在原始响应触发函数(EX. With 404 Status)中,如何读取存储在 S3 中的 HTML 文件并将其内容用于响应正文?
(我想像 CloudFront 一样手动返回自定义错误页面,但根据 cookie 选择它)。
注意:S3 中的 HTML 文件存储在我网站的同一个存储桶中。启用 OAI。
非常感谢!
具体来说,在原始响应触发函数(EX. With 404 Status)中,如何读取存储在 S3 中的 HTML 文件并将其内容用于响应正文?
(我想像 CloudFront 一样手动返回自定义错误页面,但根据 cookie 选择它)。
注意:S3 中的 HTML 文件存储在我网站的同一个存储桶中。启用 OAI。
非常感谢!
Lambda@Edge 函数目前¹无法直接访问来自源的任何正文内容。
您需要授予 Lambda 执行角色必要的权限以从存储桶中读取数据,然后使用s3.getObject()
JavaScript 开发工具包从存储桶中获取对象,然后使用其主体。
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 控制台来执行此操作。“启用触发器和复制”复选框的措辞给您的印象是它正在做一些重要的事情,但事实证明......它不是。更改 CloudFront 配置中的版本号并保存更改可实现相同的目的。
创建新版本的函数后,您只需转到 CloudFront 控制台中的缓存行为并编辑触发器 ARN 以使用新版本号,然后保存更改。
¹目前,但我已将此作为功能请求提交;这可能允许响应触发器接收响应正文的副本并重写它。它必然会限制为 Lambda API 的最大大小(或更小,因为生成的响应目前是有限的),并且可能不适用于这种情况,因为我假设您可能正在获取特定于语言的响应。
²已经在环境中。如果我没记错的话,很久以前,Lambda@Edge 不包含 SDK,但现在它一直存在。