本地正常的Python代码在AWS Lambda中报TypeError参数不匹配错误
解决AWS Lambda中lambda_handler参数不匹配错误
问题现象
本地运行正常的Python代码部署到AWS Lambda后触发报错,错误信息为:lambda_handler() takes 0 positional arguments but 2 were given
原代码
import pymysql dbhost = 'database.ap-south-1.rds.amazonaws.com' dbuser = 'admin' dbpass = 'admin123' dbname = 'classicmodels' connection = pymysql.connect(host=dbhost, user=dbuser, password=dbpass, database=dbname) def lambda_handler(): cursor = connection.cursor() cursor.execute('SELECT * FROM Persons') rows = cursor.fetchall() for row in rows: print ("{0} {1} {2}".format(row[0], row[1], row[2])) lambda_handler()
错误详情
{ "errorMessage": "lambda_handler() takes 0 positional arguments but 2 were given", "errorType": "TypeError", "requestId": "fb790715-91f1-4f7a-961f-b83485d23b68", "stackTrace": [" File \"/var/runtime/awslambdaric/bootstrap.py\", line 149, in handle_event_request\n response = request_handler(event, lambda_context)\n" ] }
函数日志
START RequestId: fb790715-91f1-4f7a-961f-b83485d23b68 Version: $LATEST [ERROR] TypeError: lambda_handler() takes 0 positional arguments but 2 were given Traceback (most recent call last): File \"/var/runtime/awslambdaric/bootstrap.py\", line 149, in handle_event_request response = request_handler(event, lambda_context) END RequestId: fb790715-91f1-4f7a-961f-b83485d23b68 REPORT RequestId: fb790715-91f1-4f7a-961f-b83485d23b68 Duration: 1.07 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 44 MB
错误原因
AWS Lambda在触发lambda_handler函数时,会自动传入两个固定参数:
event:触发Lambda的事件数据(比如API Gateway请求、S3事件等)lambda_context:Lambda运行时的上下文信息(包含请求ID、超时时间等)
原代码中的lambda_handler函数没有声明这两个参数,导致Lambda调用时参数不匹配,抛出类型错误。另外,本地测试时手动调用lambda_handler()不带参数可以正常运行,但Lambda环境会强制传递这两个参数。
修正方案
1. 修正函数参数
给lambda_handler添加event和lambda_context参数,即使业务逻辑不需要使用这两个参数,也必须声明。
2. 移除手动调用语句
Lambda会自动触发lambda_handler函数,不需要在代码末尾手动调用lambda_handler()。
3. 优化数据库连接(可选但推荐)
将数据库连接放在函数内部,避免Lambda执行环境复用导致的连接超时失效问题,同时确保使用后关闭连接。
修正后的代码
import pymysql def lambda_handler(event, lambda_context): dbhost = 'database.ap-south-1.rds.amazonaws.com' dbuser = 'admin' dbpass = 'admin123' dbname = 'classicmodels' # 在函数内部创建数据库连接 connection = pymysql.connect(host=dbhost, user=dbuser, password=dbpass, database=dbname) try: cursor = connection.cursor() cursor.execute('SELECT * FROM Persons') rows = cursor.fetchall() for row in rows: print("{0} {1} {2}".format(row[0], row[1], row[2])) finally: # 确保函数执行完毕后关闭连接 connection.close()
额外注意事项
- Lambda执行环境会被复用,全局变量的数据库连接可能因长时间闲置被RDS主动断开,建议在函数内部创建和销毁连接。
- 确保Lambda的执行角色拥有访问目标RDS数据库的权限,同时RDS的安全组要允许Lambda所在的VPC访问。
内容的提问来源于stack exchange,提问作者Gaurav Bhatkar
相关产品推荐
相关产品推荐

