Cloudfront Lambda Egde错误?更改查看器响应中的响应状态代码

时间:2019-01-22 22:04:01

标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudfront aws-lambda-edge

问题是:为什么在lambda边缘的ViewerResponseEvents中返回响应之前,无法更改http状态?

我有一个Lambda函数,该函数必须检查每个响应并根据lambda函数中包含的JSON文件更改其状态代码。我在 Viewer响应中部署了该lambda函数,因为我希望该函数在每个响应之前在返回前执行。 Aws文档(https://aws.amazon.com/blogs/networking-and-content-delivery/lambdaedge-design-best-practices/)指出,如果要对所有请求执行功能,则应将其放置在查看器事件中。

cloudfront events

因此,我创建了一个简单的函数,该函数基本上是在返回响应之前克隆和更改响应的http状态代码。我做了以下代码进行测试:

exports.handler = async (event) => {
 const request = event.Records[0].cf.request;
 console.log(request);
 console.log(`Original response`);
 const response = event.Records[0].cf.response;
 console.log(`Original response`);
 console.log(response);
//clone response just for change the status code
 let cloneResponseReturn = JSON.parse(JSON.stringify(response));
 cloneResponseReturn.status  = 404;
 cloneResponseReturn.statusDescription = 'Not Found';

console.log('Log Clone Response Return');
console.log(cloneResponseReturn);

return cloneResponseReturn;

};

当我访问cloudwatch中的日志时,它表明响应具有http 404代码,但是由于某些原因,cloudfront仍返回带有200状态代码的响应。 (我已经清除了浏览器缓存,并在邮递员等其他工具中对其进行了测试,但所有这些工具中,CloudFront均返回HTTP 200)

CloudWatch日志和响应打印:

cloud-watch log response

如果我将此功能更改为在原始响应中执行,它将起作用,但我不想仅在缓存未命中时执行它(+如aws告诉我们仅在那种情况下才执行原始事件)。由于原始事件仅在高速缓存未命中执行,因此要执行重定向,我将必须创建一个chache头文件,以确保将始终执行原始事件。

真的很奇怪Edge Lambda的这种行为。有人知道我该如何解决吗?我已经尝试清理用于测试请求的浏览器和工具的缓存,也清理我的发行版的缓存,但仍然无法正常工作。

我一周前已在AWS论坛上发布了问题,但仍未得到答案:https://forums.aws.amazon.com/message.jspa?messageID=885516#885516

谢谢。

0 个答案:

没有答案