AWSLambda.invoke在被调用Lambda成功完成后未返回问题排查求助
问题:AWS Lambda调用超时异常(子Lambda已完成但父Lambda持续等待)
场景概述
我有两个AWS Lambda函数:
- 子Lambda:接收文件类型参数,从匹配的DynamoDB读取数据并生成单个输出文件
- 父Lambda:遍历所有文件类型列表,通过ExecutorService为每个类型提交生成文件的任务,任务中执行
AWSLambda.invoke()调用子Lambda,最终将所有生成的文件合并为压缩包,目标是每日生成一个文件
异常现象
流程对29个文件类型均正常,但针对一个耗时最长(约6分钟)的文件出现异常:
- 子Lambda已成功执行完成(日志显示执行时长约371秒),但父Lambda的
invoke()调用持续等待,最终父Lambda因达到900秒执行上限终止 - 时间线示例:父Lambda于15:50:33启动,子Lambda于15:50:57启动、15:56:47完成,父Lambda却一直等待至16:03才终止,期间其他29个子任务均已启动并完成
- 该流程此前正常运行数月,问题突然出现,重新部署代码后恢复正常,未发现任何影响该逻辑的代码变更
父Lambda触发子Lambda的Callable代码
InvokeRequest lmbRequest = new InvokeRequest() .withFunctionName(functionname) .withPayload(inputJSON ); lmbRequest.setInvocationType(InvocationType.RequestResponse); ClientConfiguration configuration = new ClientConfiguration(); configuration.setSocketTimeout(700000000); // 700 secs max configuration.setClientExecutionTimeout(700000000); configuration.setRequestTimeout(700000000); AWSLambda lambda = AWSLambdaClientBuilder.standard() .withClientConfiguration(configuration) .withRegion(region) .withCredentials(new DefaultAWSCredentialsProviderChain()).build(); InvokeResult lambdaresult = lambda.invoke(lmbRequest); String error = lambdaresult.getFunctionError(); if (error != null) throw ...; else return lambdaresult;
子Lambda日志信息
日志开头
START RequestId: 34d69efa-a261-40df-a4e7-d4a47bcb5c6c Version: $LATEST 2023-02-24 16:52:37 34d69efa-a261-40df-a4e7-d4a47bcb5c6c INFO File 11 triggered
日志结尾
2023-02-24 16:58:48 34d69efa-a261-40df-a4e7-d4a47bcb5c6c INFO File 11 created END RequestId: 34d69efa-a261-40df-a4e7-d4a47bcb5c6c REPORT RequestId: 34d69efa-a261-40df-a4e7-d4a47bcb5c6c Duration: 371068.41 ms Billed Duration: 371069 ms Memory Size: 4096 MB Max Memory Used: 4096 MB
补充说明
子Lambda日志显示内存已完全占满(配置4096MB,最大使用4096MB),虽未抛出异常,但内存中存在大量数据,计划提升该Lambda的最大内存配置。
内容的提问来源于stack exchange,提问作者Werner Daehn
相关产品推荐
相关产品推荐

