AWS Lambda添加lambda_handler后函数无响应无报错排查
核心问题
你遇到的无反馈问题首先是Python缩进语法错误导致的:
Python依靠缩进划分代码块,你当前代码中def lambda_handler(event, context):下方的所有业务逻辑(初始化ZenRowsClient、发送请求、打印结果)都没有做函数级缩进,会被Python识别为全局作用域代码,完全不属于入口函数的执行范围。
这也刚好解释了你遇到的现象:
- 不写
lambda_handler时,整个文件都是全局逻辑,直接运行Python文件会从上到下顺序执行,ZenRows请求可以正常发起 - 加上入口函数后,
lambda_handler实际是个空函数,Lambda触发时执行完空函数直接退出,不会跑任何爬取逻辑;全局代码仅在Lambda实例冷启动的加载阶段执行一次,产生的输出会因为函数快速退出无法被日志系统完整采集,所以看起来既没有执行结果也没有报错。
其他必须排查的配置问题
- 执行超时配置:Lambda默认超时时间是3秒,网页爬取场景很容易触发超时,测试阶段先把超时时间调整到10秒以上。
- 网络配置:如果Lambda部署在自定义VPC内,必须配置NAT网关才能访问公网发起ZenRows请求,否则请求会直接卡死超时。
- 入口配置:确认Lambda控制台的Handler配置和代码文件名、函数名匹配,比如代码文件名为
lambda_function.py,Handler值必须填lambda_function.lambda_handler,否则Lambda找不到入口会直接报错。 - 依赖打包:部署包必须包含
zenrows依赖,或者通过Lambda Layer安装对应依赖,否则运行时会抛出模块找不到的错误。 - 日志配置:不要仅靠
print输出结果,需要给Lambda执行角色绑定CloudWatch Logs写入权限,才能正常采集运行日志;业务结果建议直接作为函数返回值返回,方便直接查看执行结果。 - 安全风险:你代码里硬编码了ZenRows的API密钥,建议存到Lambda环境变量中读取,不要直接写在源码里避免密钥泄露。
修正后的参考代码
import json import os from zenrows import ZenRowsClient def lambda_handler(event, context): # 注意:函数内所有代码必须缩进4个空格,属于handler的执行范围 client = ZenRowsClient(os.getenv("ZENROWS_API_KEY"), retries=1) url = "https://www.crunchbase.com/organization/softbank" response = client.get(url, params={"autoparse": True}) print(response.text) # Lambda入口函数需要返回标准格式的响应结果 return { "statusCode": 200, "body": json.dumps({ "crawl_data": response.text }, ensure_ascii=False) }
测试建议
部署完成后先在Lambda控制台创建测试事件直接触发函数,不要先绑定API网关、定时任务等其他触发器,方便第一时间查看执行日志、返回结果和报错信息,等爬取逻辑跑通后再对接后续的数据库存储、用户授权返回逻辑。
内容的提问来源于stack exchange,提问作者Tori Elstrom
相关产品推荐
相关产品推荐

