我想使用S3对象元数据和DB(或某些远程服务)中的某些角色数据(具体针对当前用户)来确保Cloudfront响应的安全。我想我应该在这里使用viewer-response
事件,以便一起访问S3数据和用户数据。我尝试在status
对象中设置statusDescription
和response
,但是它不适用于viewer-response
事件,适用于所有其他事件。设置标题仍然有效。
exports.handler = async (event) => {
const response = event.Records[0].cf.response;
const request = event.Records[0].cf.request;
const isUserAllowed = await allowedByTokenAndDb(request);
const isS3ObjectAllowed = response.headers['x-amz-meta-isSecure'][0].value === 'true';
if (!isUserAllowed || !isS3ObjectAllowed) {
response.status = '403'; // does not work
response.statusDescription = 'Nothing';
}
response.headers['X-Powered-By'] = [{ // works, header will be added
key: 'X-Powered-By',
value: 'lol',
}]
return response;
}
有什么方法可以使viewer-response
返回另一个状态? AWS文档没有告诉您是否可能。也许还有其他解决方案?
答案 0 :(得分:0)
此功能演示在以下情况下如何将响应状态更新为200并生成静态内容以返回查看器:
该功能在原点响应中触发
原始服务器的响应状态是错误状态代码(4xx或5xx)
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
/**
* This function updates the response status to 200 and generates static
* body content to return to the viewer in the following scenario:
* 1. The function is triggered in an origin response
* 2. The response status from the origin server is an error status code (4xx or 5xx)
*/
if (response.status >= 400 && response.status <= 599) {
response.status = 200;
response.statusDescription = 'OK';
response.body = 'Body generation example';
}
callback(null, response);
};
答案 1 :(得分:0)
根据文档,您似乎只能更改 viewer-request
、origin-request
和 origin-response
事件处理程序中的响应。此页面没有明确声明您不能更改 viewer-response
事件处理程序中的响应,但它确实暗示,因为它只讨论支持其他三个:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-updating-http-responses.html
和您一样,我也无法让它工作,但我最终使用 origin-response
来满足我的需求。
答案 2 :(得分:0)
无法更改状态代码、正文 和一组根据 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html
的标题具体来说,它说
<块引用>查看器响应事件的边缘函数无法修改 HTTP 响应的状态码,无论响应是否到来 来自源或 CloudFront 缓存。