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

使用Boto3调用Lambda时,如何传递返回数据集的函数参数?

把MySQL查询结果通过Lambda Payload传递给另一个Lambda的实现方案

看了你的代码,发现几个可以优化的点,同时帮你把逻辑理顺,确保能顺利把查询结果传给目标Lambda:

先说说当前代码里的小问题

  1. 你在handler里重复调用了两次df.make_dataframe(),这会导致执行两次MySQL查询,完全没必要,浪费资源还慢;
  2. FunctionName只写了arn:aws:lambda:,这肯定调用失败,得补全完整的ARN(比如加上区域、账号ID和函数名);
  3. 没加错误处理,万一调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:25:14