首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda Edge 502具有来自查看器响应的自定义响应

Lambda Edge 502具有来自查看器响应的自定义响应
EN

Stack Overflow用户
提问于 2021-04-26 06:18:23
回答 1查看 681关注 0票数 0

我使用一个URL查询字符串来调试我的viewer-requestviewer-response lambda@edge函数,方法是将event作为JSON返回到前端(FYI这样我就可以通过外部监视工具检查某些东西是否存在)。

如果我转到viewer-request:,会得到一个viewer-request事件的JSON:

代码语言:javascript
复制
import json

def lambda_handler(event, context):

    request = event["Records"][0]["cf"]["request"]
    if "debug_viewer_request_event" in request["querystring"]:
        response = {
            "status": "200",
            "statusDescription": "OK",
            "headers": {
                "cache-control": [
                      {
                          "key": "Cache-Control",
                          "value": "no-cache"
                      }
                ],
                "content-type": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ]
            },
            "body": json.dumps(event)
        }
        return response
   # rest of viewer-request logic...

用cURL进行测试:

代码语言:javascript
复制
curl -i https://example.org/?debug_viewer_request_event
HTTP/2 200 
content-type: application/json
content-length: 854
server: CloudFront
date: Mon, 26 Apr 2021 06:05:28 GMT
cache-control: no-cache
x-cache: LambdaGeneratedResponse from cloudfront
via: 1.1 xxxxxxxxxxx.cloudfront.net (CloudFront)
x-amz-cf-pop: AMS50-C1
x-amz-cf-id: pU0ItvQA1-r5v3yR1Dl6Z3VpPW_EuuUCHhnOD60uLhng...

{"Records": [{"cf": {"config": {"distributionDomainName": "xxxxxxx.cloudfront.net", "distributionId": "xxxxxxx", "eventType": "viewer-request", "requestId": "pU0ItvQA1-r5v3yR1Dl6Z3VpPW_EuuUCHhnOD60uLhng...

然而,当我对viewer-response 502 做同样的操作时,会得到一个502错误

  • 除了debug_viewer_request_eventdebug_viewer_response_event之外,代码是相同的。
  • 如果我不包括调试查询字符串,响应是200 OK,所以我知道总体上这两个lambda都正常工作(viewer-response的调试除外)

下面是cURL输出:

代码语言:javascript
复制
curl -i https://example.org/?debug_viewer_response_event
HTTP/2 502 
content-type: text/html
content-length: 1013
server: CloudFront
date: Mon, 26 Apr 2021 06:07:39 GMT
x-cache: LambdaValidationError from cloudfront
via: 1.1 xxxxxxxxx.cloudfront.net (CloudFront)
x-amz-cf-pop: AMS50-C1
x-amz-cf-id: NqXQ-FFEsIX-fEt8IvlHFTYoQdrZSGPScq1H-KNwVWR0-xxxxxx

The Lambda function result failed validation: The function tried to add, delete, or change a read-only header

如果我查看在医生那里,“CloudFront Viewer响应事件的只读标题”的列表是:

  • 内容编码
  • 内容长度
  • 传输编码
  • 警告
  • 通过

据我所见,我没有直接更改任何这些头,但我猜是因为我正在修改响应,所以像Content-Length这样的头被修改了

viewer-response Q:是否有一种方法可以将事件作为JSON返回到前端进行调试,还是由于无法更改 Content-Length**?**而根本不可能

EN

回答 1

Stack Overflow用户

发布于 2021-10-17 17:26:49

据我所见,我没有直接更改任何这些标题,但我猜测,因为我正在修改响应,所以修改了内容长度之类的标题。

我同意,我认为你的问题是你要回复,而不是打电话给你

代码语言:javascript
复制
callback(null, response);

其中回调应该是lambda处理程序func的第三个参数:

代码语言:javascript
复制
def lambda_handler(event, context, callback):

由于内容长度不是可变的,我们应该假设(实际上至少对于查看器请求函数是这样的),cloudfront将在边缘函数中生成响应时为您生成它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67261691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档