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

Ern*_*ano 1 amazon-s3 custom-error-pages amazon-web-services aws-lambda aws-lambda-edge

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

(我想像CloudFront一样手动返回自定义错误页面,但要基于cookie选择它)。

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

非常感谢你!

Mic*_*bot 6

Lambda @ Edge函数当前不能¹直接从源头访问任何正文内容。

您将需要授予Lambda执行角色必要的特权,以便从存储桶中读取内容,然后s3.getObject()从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 ...
Run Code Online (Sandbox Code Playgroud)

请注意,更新Lambda @ Edge函数的麻烦之一是,Lambda控制台给人的印象是重新部署它非常烦人……但是您不必使用Lambda控制台来执行此操作。“启用触发器和复制”复选框的措辞给人以为它在做重要的事情,但事实证明……并非如此。在CloudFront配置中更改版本号并保存更改即可实现相同的目的。

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


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

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