通过Function URL调用AWS Lambda报InternalServerError的原因排查求助
问题原因及解决方案
出现KeyError: 'app_version'的核心原因是通过Function URL触发Lambda时,传入的event结构与控制台测试的结构完全不同,具体细节如下:
关键差异
- 控制台测试时,你直接构造了以
app_version为根键的event对象,Lambda可以直接通过event['app_version']取值。 - 但通过Function URL触发时,Lambda收到的是标准化的API Gateway V2格式event,POST请求的内容会被包裹在
event['body']字段中,且该字段值是JSON字符串,而非直接的字典结构。典型的event结构示例:
{ "version": "2.0", "routeKey": "$default", "rawPath": "/", "headers": { "content-type": "application/json" }, "body": "{\"app_version\":\"1.1.0\"}", "isBase64Encoded": false }
额外可能的触发因素
- 若在Insomnia中未设置请求头
Content-Type: application/json,Lambda收到的body可能为空或无法被正确识别为JSON格式,进一步导致解析失败。
修复后的代码
修改Lambda函数,先解析event['body']中的JSON字符串,再提取app_version:
import json def lambda_handler(event, context): current_version = "1.2.10" # 解析请求体并处理异常 try: request_body = json.loads(event.get('body', '{}')) app_version = request_body['app_version'] except (KeyError, json.JSONDecodeError): return { 'statusCode': 400, 'body': json.dumps({'error': '请求格式错误,缺少必要字段app_version'}) } # 判断版本是否需要更新 update_required = app_version != current_version return { 'statusCode': 200, 'body': json.dumps({'updateReq': update_required}) }
验证步骤
- 在Insomnia中确保POST请求的
Content-Type头设置为application/json。 - 重新发送请求,此时Lambda能正确解析请求体并返回结果。
内容的提问来源于stack exchange,提问作者RamondC
相关产品推荐
相关产品推荐

