AWS Lambda获取apiKeyId遇KeyError:'requestContext'缺失问题咨询
AWS Lambda获取apiKeyId时requestContext缺失的问题及解决办法
一、字段缺失的原因
- 控制台测试事件是自定义模拟结构:前辈的代码是针对API Gateway触发Lambda的场景编写的,而AWS控制台默认生成的测试事件是极简模板,不会包含
requestContext这类由API Gateway注入的上下文信息。只有当Lambda被API Gateway(REST API/HTTP API)实际调用时,才会自动填充这些字段。 - API Gateway配置不完整:即使是API Gateway触发,如果没启用API Key认证、或者未配置将API Key信息传递给Lambda,
requestContext.identity.apiKeyId也不会出现。比如REST API需要确保集成请求的映射模板包含上下文变量,HTTP API需要在集成设置里选择包含上下文数据的payload格式。
二、获取apiKeyId的其他方式
1. 正确通过API Gateway触发并配置传递
- REST API场景:确保API启用了API Key认证,在集成请求的「映射模板」中,添加对
requestContext.identity.apiKeyId的传递(比如使用VTL模板{"apiKeyId": "$context.identity.apiKeyId"}),这样Lambda的event中就能拿到该字段。 - HTTP API场景:HTTP API的上下文字段路径不同,需要从
event['requestContext']['http']['apiKeyId']获取,同时要确保在HTTP API的集成设置中,将「Payload格式版本」设为2.0(只有2.0版本会包含完整的上下文信息)。
2. 手动构造测试事件模拟
如果需要在控制台测试,可以手动修改测试事件,添加requestContext结构,比如:
{ "httpMethod": "GET", "queryStringParameters": {"q": "toto"}, "requestContext": { "identity": { "apiKeyId": "your-test-api-key-id" } } }
3. 通过请求头获取并查询API Key ID
如果客户端请求中直接携带了x-api-key请求头(API Key的值),可以先从event中拿到该值:
api_key_value = event['headers'].get('x-api-key')
然后使用boto3调用API Gateway的get_api_key接口,通过API Key的值查询对应的ID(需要Lambda有apigateway:GetApiKey权限):
import boto3 client = boto3.client('apigateway') response = client.get_api_key( value=api_key_value, includeValue=False ) api_key_id = response['id']
内容的提问来源于stack exchange,提问作者theonewhodidnotknow
相关产品推荐
相关产品推荐

