上下文:
我正在尝试在AWS s3上读取一个csv文件,计算其数据并将结果写入同一s3存储桶中的另一个csv。
我尝试了以下代码来创建一个类,该类将读取我的Main
,并将参数存储在名为lambdaCmd.txt
的文本文件中。每次修改lambdaCmd.txt
时,都会触发lambda函数,并通过lambdaCmd.txt
参数将s3event
的内容传递给以下类:
public class LambdaCmd implements RequestHandler<S3Event, Void>{
static final Logger LOGGER = LogManager.getLogger(LambdaCmd.class);
@Override
public Void handleRequest(S3Event s3event, Context context) {
//Getting my txt file's path
S3EventNotification.S3EventNotificationRecord record = s3event.getRecords().get(0);
String bkt = record.getS3().getBucket().getName();
String key = record.getS3().getObject().getKey().replace('+', ' ');
try {
key = URLDecoder.decode(key, "UTF-8");
} catch (UnsupportedEncodingException ex) {
LOGGER.error(ex);
}
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
try {
//Getting my text file as a String Stream
InputStreamReader cmdStream =
new InputStreamReader(s3Client.getObject(bkt, key).getObjectContent());
BufferedReader br = new BufferedReader(cmdStream);
//Parsing the command in cmdStream
//...
//The command is now "String[] cmdArray" to be passed to my main
MyMain.main(cmdArray);
//The main function reads and write from s3 with a similar use of s3Client
br.close();
} catch (IOException | IllegalArgumentException | NullPointerException ex) {
LOGGER.error(ex);
}
return null;
}
}
问题:
在此代码中记录了一些调试消息后,我发现lambda函数停止在此行:
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
这是CloudWatch日志(我用##########
隐藏了个人信息):
START RequestId: ########## Version: $LATEST
16:12:11.596 [main] DEBUG path.to.mylambdaclass.LambdaCmd - LambdaCmd started
16:12:11.616 [main] DEBUG path.to.mylambdaclass.LambdaCmd - Just before creating s3Client
END RequestId: ##########
REPORT RequestId: ########## Duration: 12398.45 ms Billed Duration: 12400 ms Memory Size: 128 MB Max Memory Used: 67 MB
创建s3Client
之后,我也有一条日志消息,但是它没有打印在日志中。
问题:
为什么我的lambda过早结束?我会滥用一些物体吗?
答案 0 :(得分:1)
在添加以下try / catch并将所有代码包装在handleRequest
方法中之后(我没有捕获错误,这就是为什么我没有看到它的原因):
try {
//My code above
} catch (Error | Exception e) {
LOGGER.error(e);
}
我有一个java.lang.OutOfMemoryError
。我将lambda内存设置为128MB,因为我在本地的代码使用的内存不足。但是看来从s3读取数据还需要更多,现在512MB可以正常工作。