Lambda函数向CloudFront

时间:2017-08-16 14:14:25

标签: aws-lambda amazon-cloudfront amazon-cloudwatch

我正在尝试按照https://medium.com/@tom.cook/edge-lambda-cloudfront-custom-headers-3d134a2c18a2

中的说明操作

我让CloudFront成功地坐在一个静态的S3" hello world" HTML文件,我想使用lambda edge设置其他标头,但是我收到了一个错误。真正令人沮丧的是,我找不到任何错误日志来调试出错的地方。这是浏览器显示的内容。

ERROR

The request could not be satisfied.

The Lambda function returned an invalid request or response to CloudFront. 
Generated by cloudfront (CloudFront)
Request ID: 2Cqex7euzH0Iigps58i9tMVxdqAaLznL2ZjwqR1sW1AZHz6x2EwfMA==

这是我简单的lambda的代码:

exports.handler = (event, context, callback) => {
    console.log(event)
    callback(null, 'Hello from Lambda');
};

触发器类型为viewer-response,并附加到我的CloudFront分配(如果重要,则附加Cache Behavior: *)。 lambda具有与AWSLambdaBasicExecutionRole相对应的角色,它提供对Cloudwatch的写访问权。

一旦我启用了触发器,对Web请求的响应就会从我的" Hello world" HTML上面的错误,所以我知道它是触发lambda。但是在lambda仪表板中,它没有显示任何调用或错误。 Cloudwatch中不显示任何日志。 CloudFront仪表板显示错误(5xx),但没有显示lambda。

如果我然后通过单击已部署的函数在lambda控制台中测试我的函数,将测试事件配置为" CloudFront修改响应标题,"并且击中测试,它是成功的。 Cloudwatch显示测试的日志和控制台输出!但是在实时调用的日志中仍然没有任何内容。

我唯一的理论是权限有问题,CloudFront实际上无法调用lambda(解释为什么lambda仪表板中没有任何内容)。最后一点是CloudFront日志(在S3中)显示带有502错误和LambdaValidationError的Web请求,但我无法弄清楚这是否有帮助。

2 个答案:

答案 0 :(得分:7)

您正在查看的博客文章中的示例是有效的,而Lambda @ Edge仍在预览中(在启动到普遍可用性之前对特定客户的访问受限),但它不再正确。在服务启动前不久,数据结构发生了变化。

响应标头数据结构以前看起来像这样:

headers['Strict-Transport-Security'] = "max-age=31536000; includeSubdomains; preload";
headers['Content-Security-Policy']   = "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'";
headers['X-Content-Type-Options']    = "nosniff";

新结构如下所示:

headers['strict-transport-security'] = [{
    key:   'Strict-Transport-Security', 
    value: "max-age=31536000; includeSubdomains; preload"
}];

headers['content-security-policy'] = [{
    key:   'Content-Security-Policy', 
    value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"
}];

headers['x-content-type-options'] = [{
    key:   'X-Content-Type-Options',
    value: "nosniff"
}];

外部对象中的键必须是内部对象的每个成员中key值的小写等效值。为了更准确地反映HTTP标头必须处理的方式,最有可能需要对数据结构进行此更改,因为在HTTP / 1.x中它们不区分大小写,但在Javascript对象中,键区分大小写。

如果您的代码返回的结构不符合CloudFront要求Lambda @ Edge返回的结构,那么您看到的错误确实会被抛出。没有生成日志,因为日志没有位置 - 这个错误发生在Lambda之外,在Lambda和CloudFront之间的接口边界的CloudFront端,它不生成任何用户可访问的日志。 / p>

请参阅Response Event Structure的文档。

答案 1 :(得分:2)

Lambda @ Edge和CloudFront存在一些常见的“陷阱”。你需要:

  • 发布您Lambda函数的新版本
  • 将CloudFront Lambda关联更新为您的新版本,例如arn:aws:lambda:us-east-1:572007530218:function:gofaas-WebAuthFunction:45
  • 请求者
  • 的区域中查找Lambda @ Edge日志

据我所知,你无法看到主要Lambda func的“副本”分布到“边缘”的调用指标。

这与保存代码更改并从监控选项卡跳转到日志的“普通”Lambda Web控制台流程不同。

看一下自动部署this boilerplate appLambda@Edge OAuth and Cookie handler,这需要花费大量精力来设置它。