AWS S3 NoSuchKey异常排查:Lambda测试正常前端调用失败
问题分析与解决办法
1. S3 NoSuchKey 异常(核心键匹配问题)
- 核对前端传入的S3对象键和实际S3文件的键:S3键区分大小写,要注意有没有多余空格、开头/结尾斜杠、后缀拼写错误(比如
.csv写成.CSV)。 - 在Lambda代码里加日志打印传入的键值,比如:
然后去CloudWatch日志里对比这个键和S3控制台里的实际文件键,就能发现是否有传递错误。import json def lambda_handler(event, context): req_body = json.loads(event['body']) s3_key = req_body.get('s3_key') print(f"Received S3 key: {s3_key}") # 打日志看实际传入的键 # 后续逻辑... - 如果键包含特殊字符(空格、中文等),前端必须用
encodeURIComponent()编码,Lambda端再用decodeURIComponent()解码,否则传递过程中字符会被转义,导致找不到文件。
2. 浏览器403跨域错误(CORS缺失)
- 给托管静态页面的S3桶加CORS策略,允许API Gateway域名的跨域请求:
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>https://你的API-Gateway域名</AllowedOrigin> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>OPTIONS</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration> - 同时在API Gateway控制台开启对应API的CORS,把S3静态页面的域名设为Allowed Origin。
3. API Gateway 502错误(Lambda超时)
- Lambda默认超时是3秒,你的函数要跑40秒,肯定会被中断,导致API Gateway返回502。
- 去Lambda控制台的「配置」→「常规配置」里,把超时时间调到至少50秒(留些冗余,最大能设15分钟)。
- 同步调整API Gateway的集成超时:在API Gateway的对应集成请求设置里,把超时时间改成和Lambda匹配的值。
4. API Gateway 参数映射验证
- 确认API Gateway用的是Lambda代理集成,并且前端POST的Body是JSON格式,Lambda能正确解析:比如前端用
fetch发送请求时,要设置headers: {'Content-Type': 'application/json'},并且把参数用JSON.stringify()转成字符串。 - 检查Lambda里拿参数的逻辑:如果是代理集成,必须先把
event['body'](字符串)转成字典再取键值,不能直接用event['s3_key']。
额外排查步骤
- 用Postman直接调用API Gateway的端点,模拟前端请求,看返回结果和CloudWatch日志,先排除前端代码的问题。
- 虽然Lambda测试正常,但还是要确认IAM角色的权限:确保角色有
s3:GetObject权限,且S3桶策略没有拒绝该角色的访问(测试用的是控制台触发,前端触发的上下文和测试一致,但还是要核对)。
内容的提问来源于stack exchange,提问作者steveh
相关产品推荐
相关产品推荐

