使用Boto3调用Lambda时,如何传递返回数据集的函数参数?
把MySQL查询结果通过Lambda Payload传递给另一个Lambda的实现方案
看了你的代码,发现几个可以优化的点,同时帮你把逻辑理顺,确保能顺利把查询结果传给目标Lambda:
先说说当前代码里的小问题
- 你在handler里重复调用了两次
df.make_dataframe(),这会导致执行两次MySQL查询,完全没必要,浪费资源还慢; FunctionName只写了arn:aws:lambda:,这肯定调用失败,得补全完整的ARN(比如加上区域、账号ID和函数名);- 没加错误处理,万一调用Lambda时出问题(比如权限不够、函数不存在),没法及时排查。
优化后的完整代码
首先是Test类的make_dataframe方法(微调JSON输出格式)
import pandas as pd from MysqlConnection import MysqlConnection from sqlalchemy import text class Test: def make_dataframe(self): conn = MysqlConnection() query = text("""select * from queue WHERE estatus = 'PENDING' limit 4;""") df = pd.read_sql_query(query, conn.get_engine()) # 用'records'格式转JSON,输出对象数组,目标Lambda更好处理 return df.to_json(orient='records')
然后是主Lambda的处理函数
import json import boto3 from Test import Test # 把Lambda客户端初始化放外面,Lambda会复用连接,提升性能 client = boto3.client('lambda') def lambda_handler(event, context): # 实例化Test类,只调用一次获取查询结果 test_instance = Test() df_json = test_instance.make_dataframe() # 解析成Python对象(要是不需要修改数据,也可以直接把df_json传给json.dumps) payload_data = json.loads(df_json) try: # 调用目标Lambda,记得补全完整的ARN response = client.invoke( FunctionName='arn:aws:lambda:你的AWS区域:你的账号ID:function:目标Lambda函数名', InvocationType='RequestResponse', Payload=json.dumps(payload_data) ) # 解析目标Lambda的返回结果 response_payload = json.load(response['Payload']) print("\n目标Lambda返回结果:") print(json.dumps(response_payload, indent=2)) return { 'statusCode': 200, 'body': json.dumps({'message': '调用成功', 'target_response': response_payload}) } except Exception as e: print(f"调用Lambda失败: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({'error': str(e)}) }
目标Lambda怎么接收数据
在目标Lambda的handler里,直接用event参数就能拿到传递的查询结果数组,比如:
import json def lambda_handler(event, context): print("收到的查询结果:") print(json.dumps(event, indent=2)) # 遍历处理每条记录 for record in event: print(f"正在处理记录ID: {record.get('id')}") return {'statusCode': 200, 'body': json.dumps({'message': '数据处理完成'})}
几个关键注意点
- 复用查询结果:只调用一次
make_dataframe(),避免重复查数据库; - Payload格式:
orient='records'生成的JSON结构更直观,目标Lambda处理起来更方便; - 权限配置:要确保当前Lambda有调用目标Lambda的权限,得在IAM角色里加
lambda:InvokeFunction的权限; - 客户端复用:把boto3客户端放handler外,Lambda会保持连接,减少初始化开销。
内容的提问来源于stack exchange,提问作者Softcode MX
相关产品推荐
相关产品推荐

