源请求 lambda 不会从源返回任何内容

Posted

技术标签:

【中文标题】源请求 lambda 不会从源返回任何内容【英文标题】:Origin request lambda causes nothing to be returned from origin 【发布时间】:2021-11-08 05:05:41 【问题描述】:

我有一个以 s3 为来源的云端发行版。存储桶只包含一个 index.html 文件。

云端分发有一个源策略来转发 Cloudfront-Viewer-Country、Accept-Language 和来自查看器请求的所有 cookie。

通过上述方法,我可以毫无问题地访问我的测试网址。一切正常。

当我创建一个原始请求 lambda@edge 函数时,该函数仅读取 CloudFront-Viewer-Country 值并将其存储在 cookie 中,如下所示:

'use strict';

/* This is an origin request function */
exports.handler = (event, context, callback) => 
  const request = event.Records[0].cf.request;
  const headers = request.headers;
  const countryCode = headers['cloudfront-viewer-country'] ? headers['cloudfront-viewer-country'][0].value : 'CA'; 

  const response = 
    status: '200',
    headers: 
        'set-cookie': [
            key: 'set-cookie',
            value: 'locale='+countryCode,
        ]
    ,
  ;
  callback(null, response);
;

然后我部署 lambda,设置 cloudfront 触发器,使缓存无效,然后尝试导航到我的测试 url,没有返回任何内容。屏幕是空白的:(

我的 lambda 函数有问题吗?如果我将 lambda 源请求函数与云端分发解除关联,然后使缓存失效,一切都会再次运行。

【问题讨论】:

【参考方案1】:

edge lambda 应该修改请求/响应对象并返回它,而不是用其他属性不存在的新对象替换它。

类似这样的:

exports.handler = (event, context, callback) => 
  const request = event.Records[0].cf.request;
  const headers = request.headers;
  const countryCode = headers['cloudfront-viewer-country'] ? headers['cloudfront-viewer-country'][0].value : 'CA'; 

  headers['set-cookie'] = [
    [
      key: 'set-cookie',
      value: 'locale='+countryCode,
    ]
  ];

  callback(null, request);
;

【讨论】:

我不是在写你的代码让你复制和粘贴。我只是想解释一下您需要返回原始请求对象。见Lambda@Edge Example Functions 我没有复制粘贴^__^。它根本不起作用 好的,所以我回来了,能够将 cookie 标头转发到原始响应,并使用正确的国家/地区代码设置 cookie。

以上是关于源请求 lambda 不会从源返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Cloudfront 源请求中返回带有 set-cookie 标头的响应

AWS Lambda 随机返回 502 作为状态

从源映射到现有目标时,AutoMapper 不会忽略 List

web前端缓存机制

iOS:EKEventStore源/ defaultCalendarForNewEvents / calendarsForEntityType在授权后均不返回任何内容

day 18 lambda表达式