AWS Lambda部署测试出现HandlerNotFound与NameError错误如何解决
代码存在的问题
- 入口函数不匹配:AWS Lambda默认要求代码入口函数名为
lambda_handler,若使用自定义函数名需要同步修改Lambda控制台运行时设置里的handler配置,否则会触发HandlerNotFound报错。同时你修改后的代码遗漏了原有代码的导入语句、BUCKET/TOPIC_ARN等常量定义,也没有将S3对象遍历、判断的核心逻辑放到handler内部,直接导致变量找不到的NameError。 - return语句位置错误:你在handler内完成资源初始化后直接执行return,return后的所有代码完全不会运行,业务逻辑全部失效。
- 时间判断逻辑写反:初始代码中
object.last_modified > datetime.now(tzutc()) - timedelta(hours = 1)的判断条件是筛选1小时以内新上传的对象,和你需要的「存储时长超过1小时」的需求完全相反。
修复后的完整代码
import boto3 from datetime import datetime, timedelta from dateutil.tz import tzutc # 常量配置 BUCKET = 'my-bucket' TOPIC_ARN = 'arn:aws:sns:ap-southeast-2:123456789012:Old-File-Warning' MONITOR_PREFIX = 'folder1/folder2/' EXPIRE_THRESHOLD_HOURS = 1 # 资源初始化放在函数外,可复用Lambda冷启动资源,提升执行效率 s3_resource = boto3.resource('s3') sns_topic = boto3.resource('sns').Topic(TOPIC_ARN) def lambda_handler(event, context): threshold_time = datetime.now(tzutc()) - timedelta(hours=EXPIRE_THRESHOLD_HOURS) for s3_obj in s3_resource.Bucket(BUCKET).objects.filter(Prefix=MONITOR_PREFIX): # 过滤掉文件夹前缀本身,避免误报 if s3_obj.key == MONITOR_PREFIX: continue # 筛选最后修改时间早于阈值的对象,即存储时长超过1小时 if s3_obj.last_modified < threshold_time: message = f"Object {s3_obj.key} has been stored for more than 1 hour!" sns_topic.publish(Message=message) return { "statusCode": 200, "body": "Old file check completed" }
注意事项
- 需要为Lambda执行角色配置对应权限:目标S3存储桶的
s3:ListBucket权限、目标SNS主题的sns:Publish权限,否则会触发权限类报错。 - 如果监控前缀下的对象数量极多,建议添加分页逻辑,避免Lambda执行超时。
内容的提问来源于stack exchange,提问作者Aadhinarayanan J
相关产品推荐
相关产品推荐

