如何为带请求体的API Gateway Lambda代理POST方法启用缓存?
API Gateway POST代理方法请求体缓存解决方案
问题本质
API Gateway的阶段缓存默认仅基于请求路径、查询参数、指定HTTP头部生成缓存键,不会自动将POST请求体纳入缓存键逻辑。所以即便你启用了方法缓存,只要请求体以外的缓存键要素不变,就会返回旧缓存结果,且控制台确实没有直接的"请求体缓存"开关,必须通过自定义缓存键逻辑实现。
可行解决方案
方案1:Lambda函数生成请求体哈希作为缓存键的一部分
这是Lambda代理集成下最直接的实现方式,通过在Lambda中对请求体生成唯一标识,将其作为自定义头部返回,再让API Gateway把这个头部纳入缓存键:
- 修改Lambda函数,对请求体生成哈希值并加入响应头部:
import hashlib import json def lambda_handler(event, context): request_body = event.get('body', '') # 生成请求体的MD5哈希值,用于区分不同请求体 body_hash = hashlib.md5(request_body.encode('utf-8')).hexdigest() return { 'statusCode': 200, 'headers': { 'X-Request-Body-Hash': body_hash, 'Content-Type': 'application/json' }, 'body': json.dumps({'your_result': 'data_here'}) }
- 配置API Gateway缓存键:
- 进入目标POST方法的方法执行页面,打开缓存设置
- 在「缓存键设置」区域,点击「添加头部」,输入
X-Request-Body-Hash,勾选「包含在缓存键中」 - 保存配置并重新部署API到对应阶段
方案2:API Gateway映射模板注入请求体标识(适合不想修改Lambda的场景)
通过API Gateway的VTL映射模板,将请求体的编码值或哈希值注入自定义头部,再纳入缓存键(Lambda代理集成下需确认映射模板生效):
- 进入POST方法的集成请求,展开「映射模板」
- 选择对应请求内容类型(如
application/json),创建映射模板:
#set($rawBody = $input.body) #set($encodedBody = $util.base64Encode($rawBody)) $context.requestOverride.header.X-Request-Body-Encoded = $encodedBody
- 进入方法的缓存设置,将
X-Request-Body-Encoded头部添加到缓存键包含列表 - 保存并重新部署API
注意事项
- 缓存容量:如果请求体变化频繁,会生成大量缓存条目,需注意阶段缓存的容量限制,避免缓存溢出导致频繁失效
- 哈希可靠性:使用MD5足够用于缓存键区分,无需加密级哈希;若请求体过大,可选择提取关键参数生成哈希,减少计算开销
- 头部验证:配置完成后,可通过测试工具查看响应头部是否包含自定义的哈希/编码头部,确认缓存键逻辑生效
内容的提问来源于stack exchange,提问作者JPil
相关产品推荐
相关产品推荐

