如何构造Lambda调用负载以调用另一Lambda代理函数?
解决方案
核心原因
API Gateway触发Lambda A时,会将请求的JSON字符串存入event['body'],所以A中json.loads(event['body'])能正常工作。但从Lambda B调用A时,你传递的lambda_payload被json.dumps序列化为JSON字符串后,Lambda服务会自动将其反序列化为字典传给A的event参数——这就导致A收到的event['body']是一个字典而非字符串,自然触发TypeError。
不修改A的解决方法(推荐)
在B中,将lambda_payload里的body先序列化为JSON字符串,再整体转成JSON传给A。这样A收到的event['body']就和API Gateway触发时的格式一致了。
修改后的B代码:
import json import boto3 lambda_client = boto3.client('lambda') def lambda_handler(event, context): # 先把body内容转成JSON字符串 body_content = json.dumps({'user_id': 2, 'payload': {'name': "James", 'age': 35}}) lambda_payload = { 'headers': {}, 'response': False, 'queryStringParameters': {}, 'body': body_content } lambda_client.invoke( FunctionName='A', InvocationType='RequestResponse', Payload=json.dumps(lambda_payload) )
若必须修改A的备选方案
如果无法调整B的代码,可以在A中增加类型判断,兼容两种输入格式:
import json def lambda_handler(event, context): body = event['body'] # 如果是字典直接用,是字符串就解析 if isinstance(body, dict): parsed_body = body else: parsed_body = json.loads(body) # 后续用parsed_body处理业务逻辑 ...
内容的提问来源于stack exchange,提问作者Kronax
相关产品推荐
相关产品推荐

