You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:54:04