使用Python 3.9编写AWS Lambda运行Athena查询报错:name 'response' is not defined
问题解决:NameError: name 'response' is not defined
错误根源
你的代码存在变量作用域问题:response变量是在lambda_handler函数内部定义的,但你在函数外部尝试访问它——Python中函数内部定义的变量默认是局部变量,外部无法直接读取。此外代码还有两处细节错误:
- 遍历结果时写错变量名:
results应为result - 用
time.sleep(10)等待查询完成不可靠,Athena查询耗时可能超过10秒,应该通过轮询检查查询状态来确保等待逻辑可靠
修正后的代码
import time import boto3 # 创建Athena客户端 client = boto3.client('athena') # 定义查询参数 query = 'select * from mydatabase.mytable limit 8' DATABASE = 'mydatabase' output = 's3://mybucket/' def lambda_handler(event, context): # 启动查询执行 response = client.start_query_execution( QueryString=query, QueryExecutionContext={ 'Database': DATABASE }, ResultConfiguration={ 'OutputLocation': output, } ) query_execution_id = response['QueryExecutionId'] # 轮询检查查询状态,直到完成或终止 while True: query_status = client.get_query_execution(QueryExecutionId=query_execution_id) status = query_status['QueryExecution']['Status']['State'] if status in ['SUCCEEDED', 'FAILED', 'CANCELLED']: break time.sleep(2) # 每2秒检查一次状态 if status == 'SUCCEEDED': # 获取并遍历查询结果 result = client.get_query_results(QueryExecutionId=query_execution_id) for row in result['ResultSet']['Rows']: print(row) return { 'statusCode': 200, 'body': '查询执行成功' } else: error_msg = query_status['QueryExecution']['Status'].get('StateChangeReason', '未知错误') print(f"查询失败: {error_msg}") return { 'statusCode': 500, 'body': f'查询失败: {error_msg}' }
关键修正说明
- 修复作用域问题:将所有依赖
response的逻辑(获取执行ID、等待查询、读取结果)全部移入lambda_handler函数内部,确保能正常访问局部变量response - 替换不可靠等待:用轮询方式检查Athena查询状态,只有当查询进入终止状态时才继续执行,避免因查询超时导致的结果读取失败
- 修正变量名错误:将遍历结果时的
results改为result,与定义的变量名保持一致 - 增强错误处理:增加查询状态判断,失败时返回具体错误信息,提升函数的鲁棒性
内容的提问来源于stack exchange,提问作者Anson
相关产品推荐
相关产品推荐

