我使用一个URL查询字符串来调试我的viewer-request和viewer-response lambda@edge函数,方法是将event作为JSON返回到前端(FYI这样我就可以通过外部监视工具检查某些东西是否存在)。
如果我转到viewer-request:,会得到一个viewer-request事件的JSON:
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进行测试:
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_event是debug_viewer_response_event之外,代码是相同的。200 OK,所以我知道总体上这两个lambda都正常工作(viewer-response的调试除外)下面是cURL输出:
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**?**而根本不可能
发布于 2021-10-17 17:26:49
据我所见,我没有直接更改任何这些标题,但我猜测,因为我正在修改响应,所以修改了内容长度之类的标题。
我同意,我认为你的问题是你要回复,而不是打电话给你
callback(null, response);其中回调应该是lambda处理程序func的第三个参数:
def lambda_handler(event, context, callback):由于内容长度不是可变的,我们应该假设(实际上至少对于查看器请求函数是这样的),cloudfront将在边缘函数中生成响应时为您生成它。
https://stackoverflow.com/questions/67261691
复制相似问题