如何将AWS Lambda Function1的输出数组完整传递至Function2?
解决Lambda函数间传递数组的问题
看起来你遇到的问题是Function2没有接收到Function1传递的完整数组,反而只拿到了单个元素。这主要是因为Function1传递Payload的方式和Function2解析event的逻辑不匹配,下面给你两种可行的解决办法:
方案一:包装数组为字典传递(推荐)
Lambda函数之间传递数据时,更规范的做法是把数组包装在一个字典中,这样可以避免解析时的歧义,也方便后续扩展参数。
修改Function1的代码
把inputForInvoker数组放到一个字典的键下,比如sql_files:
for each in contents: print(each["Key"]) inputForInvoker.append({'SQLFilename': each["Key"]}) # 把数组包装到字典里 payload_data = {'sql_files': inputForInvoker} response = lambdac.invoke( FunctionName='arn:aws:lambda:eu-west-2:169697352176:function:pyodbc', InvocationType='RequestResponse', Payload=json.dumps(payload_data) )
修改Function2的代码
现在可以从event中取出完整的数组,然后遍历处理每个元素:
def lambda_handler(event, context): # 获取完整的SQL文件数组 sql_files = event['sql_files'] # 遍历数组处理每个文件名 for file_item in sql_files: sqlFileName = file_item['SQLFilename'] print(sqlFileName)
方案二:直接处理传入的数组(不修改Function1)
如果你不想改动Function1的传递逻辑,那Function2需要直接把event当作数组来处理,因为你当前传递的Payload就是一个JSON数组:
def lambda_handler(event, context): # event本身就是Function1传递的数组 for file_item in event: sqlFileName = file_item['SQLFilename'] print(sqlFileName)
为什么之前只拿到单个元素?
你提到Function2当前输出是{'SQLFilename': 'body_aus.sql'},这可能是因为你误将数组的第一个元素当成了整个event,或者在测试时传递了单个元素。实际上,当你直接传递数组作为Payload时,Function2的event参数会是完整的数组,而不是单个元素——你的原Function2代码event['SQLFileName']理论上会抛出KeyError(因为列表不能用字符串索引),所以应该是测试过程中出现了偏差。
内容的提问来源于stack exchange,提问作者Alla Sasikanth
相关产品推荐
相关产品推荐

