如何通过AWS Lambda返回JSON响应及S3文件存在却报NotFound错误排查
问题排查点
- IAM权限配置错误:即使S3桶内存在对应文件,若Lambda绑定的执行角色没有目标S3桶的
s3:GetObject权限,调用s3_client.get_object会返回404/403错误响应,你代码未捕获该异常直接读取返回字典的Body键,就会触发KeyError。需要给Lambda执行角色添加资源路径为arn:aws:s3:::bucketName/*的s3:GetObject权限。 - 实际运行代码与提交代码不一致:错误堆栈显示错误出现在
getPosition函数第76行message = "not existing at all!",你提供的示例代码中没有该行逻辑,大概率你在实际代码中访问了positionLoaded内不存在的键(比如读取positionLoaded['message']但S3的JSON文件无该字段),可以将positionLoaded的完整内容打印到CloudWatch确认结构。 - 代码缩进错误:你贴出的代码中
return response的缩进层级错误,不属于getPosition函数内部语句,会导致函数执行后无法正常返回结果,变量作用域异常也可能触发键访问错误,需要将return response调整到和response变量定义同级的缩进位置。 - 触发源请求结构不符合预期:如果该Lambda由API Gateway触发,API Gateway默认会将
body字段序列化为字符串而非字典,此时直接访问event['body']['id']会触发KeyError,需要先执行event['body'] = json.loads(event['body'])转成字典再读取字段,可在lambda_handler中打印完整event到CloudWatch,确认实际收到的请求结构和测试结构一致。 - S3参数配置错误:如果代码中桶名填写错误(比如大小写不匹配、多了冗余字符/空格),或者
Key生成规则和实际S3文件命名不一致,也会导致s3.get_object返回404错误,未捕获异常直接访问字典键就会报KeyError,建议给S3调用添加异常捕获逻辑:
import boto3 import json from botocore.exceptions import ClientError s3_client = boto3.client('s3') def readPosition(pId: int): try: positionFromBucketJSON = s3_client.get_object(Bucket="bucketName", Key=f"{pId}.json") content = positionFromBucketJSON['Body'].read().decode('utf-8') return json.loads(content) except ClientError as e: print(f"S3调用错误:{e.response['Error']['Message']},状态码:{e.response['ResponseMetadata']['HTTPStatusCode']}") raise
内容的提问来源于stack exchange,提问作者Manifest Man
相关产品推荐
相关产品推荐

