如何在查看者响应的Cloudfront事件中更改状态代码?

时间:2018-11-09 15:42:02

标签: amazon-cloudfront aws-lambda-edge

我想使用S3对象元数据和DB(或某些远程服务)中的某些角色数据(具体针对当前用户)来确保Cloudfront响应的安全。我想我应该在这里使用viewer-response事件,以便一起访问S3数据和用户数据。我尝试在status对象中设置statusDescriptionresponse,但是它不适用于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文档没有告诉您是否可能。也许还有其他解决方案?

3 个答案:

答案 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-requestorigin-requestorigin-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 缓存。