为什么我的Lambda函数仅偶尔向DynamoDB表写入数据?
问题根因
你遇到的现象核心是301永久重定向的浏览器缓存机制导致的,和代码逻辑、DynamoDB权限无关:
- 301状态码的定义是资源永久转移,浏览器会对该响应做长期本地缓存
- 用户首次访问链接时,请求会正常到达API Gateway触发Lambda执行,跳转正常同时写入DynamoDB
- 后续用户再次访问同一个链接时,浏览器直接读取本地缓存的重定向地址完成跳转,不会向后端发送任何请求,Lambda没有被触发,自然不会产生新的DynamoDB写入记录
- 清空浏览器缓存后,首次请求会重新发送到后端,所以写入能力恢复一次,之后又被缓存就再次失效,完全匹配你描述的故障表现
修复方案
- 把Lambda返回的
statusCode从301修改为302(临时重定向),该状态码默认不会被浏览器永久缓存 - 在Lambda的响应headers中添加缓存禁用规则,强制浏览器每次都向后端发起新请求:
headers: { Location: redirectURL, "Cache-Control": "no-store, no-cache, must-revalidate, max-age=0" }
- 检查API Gateway的对应接口配置,如果开启了接口缓存,关闭缓存或者将缓存TTL设置为0
调试验证建议
- 查看Lambda对应的CloudWatch日志,确认故障时段是否只有首次请求的调用日志,如果后续访问没有产生新的Lambda日志,即可确认请求没有到达后端,属于缓存问题
- 用curl工具重复多次调用你的API接口,curl默认不会缓存301响应,如果每次调用都能成功写入DynamoDB,即可实锤是浏览器缓存导致的问题
- 在浏览器开发者工具的「网络」面板中勾选「禁用缓存」,重复访问测试,如果每次都能正常写入DynamoDB,即可确认根因
内容的提问来源于stack exchange,提问作者Raf A
相关产品推荐
相关产品推荐

