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

本地正常的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:37:00