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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:36:06