7

我想使用 S3 对象元数据和 DB(或某些远程服务)中的某些角色数据(特定于当前用户)来保护 Cloudfront 响应。我想我应该viewer-response在这里使用事件,以便一起访问 S3 数据和用户数据。我尝试在对象中设置status和,但它不适用于事件,适用于所有其他事件。设置标题仍然有效。statusDescriptionresponseviewer-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 文档没有说明它是否可能。也许还有另一种解决方案?

4

2 回答 2

0

根据文档,您似乎只能更改 、 和 事件处理程序中viewer-requestorigin-request响应origin-response。此页面没有明确声明您不能更改viewer-response事件处理程序中的响应,但它确实暗示了这一点,因为它只谈论支持其他三个:https ://docs.aws.amazon.com/AmazonCloudFront/latest /DeveloperGuide/lambda-updating-http-responses.html

像你一样,我也无法让它工作,但我最终使用它origin-response来满足我的需求。

于 2021-03-31T20:54:27.910 回答
0

无法根据https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html更改状态代码、正文和一组标头

具体来说,它说

查看器响应事件的边缘函数无法修改响应的 HTTP 状态代码,无论响应来自源还是来自 CloudFront 缓存。

于 2021-07-09T09:51:57.717 回答