在项目中,需要处理记录为50K的文件。但是,按照AWS当前的实现,Lambda函数返回的响应有效负载大小不能超过6 mb。
有人可以帮助我知道我在这里可以采用的方法/实现方式吗?
Lambda代码:
@Override
public String handleRequest(S3Event event, Context context) {
String bucket = null;
String key = null;
String jsonStringFromCSV = null;
csvToJsonParser = new FileToJsonParserServiceImpl();
context.getLogger().log("Received event: " + event);
try {
if (null != event.getRecords().get(0) && event.getRecords().size() > 0) {
bucket = event.getRecords().get(0).getS3().getBucket().getName();
key = event.getRecords().get(0).getS3().getObject().getKey();
S3Object response = s3.getObject(new GetObjectRequest(bucket, key));
String contentType = response.getObjectMetadata().getContentType();
context.getLogger().log("CONTENT TYPE: " + contentType);
InputStream objectData = response.getObjectContent();
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(objectData, "UTF-8"));
jsonStringFromCSV = csvToJsonParser.getMemberObjectListAsJson(bufferReader);
}
return jsonStringFromCSV;
} catch (Exception e) {
e.printStackTrace();
context.getLogger().log(String.format("Error getting object %s from bucket %s. Make sure they exist and"
+ " your bucket is in the same region as this function.", key, bucket));
throw new RuntimeException(e);
}
}
答案 0 :(得分:0)
这里的响应大小不是问题,因为您已经在使用S3,毕竟,您的函数将异步执行,并且其他任何系统都无法直接获取其响应(但是,您可以发送其响应例如SNS或SQS,然后再进行处理。
要实现自己想要的目标,您可以做的就是拥有Lambda be triggered by an S3 Event。然后,您将处理该文件(但是不能超过15分钟,因此,如果文件确实很大,则Lambda可能不是此处的最佳工具,而是50K记录-考虑到记录只有几(k)字节长-应该可以)并将其输出到其他地方(例如DynamoDB,S3,RDS,SNS,SQS等)。
Lambda的有效负载大小限制绝对不是您的限制。
编辑:OP希望将CSV文件中生成的字符串存储在某处,因此这是一种实现方式:
您可以将该大JSON字符串存储在S3中的文件中,而不必调用另一个Lambda来完成此工作。长话短说,您的函数将处理CSV文件,从中生成一个字符串,然后将其保存到S3文件中。如果需要将其存储在数据库中,则可以使用DynamoDB,但是由于DDB对对象大小有限制,因此您可以在表中创建一个称为namedFilePath的属性,该属性指向您的S3对象。
如果您想使事情脱钩,您的源Lambda可以将文件存储在名为{some_identifier}_processed.txt
的S3中,然后使用此键在SQS中发送一条消息(或使用另一个S3事件,但让我们使用SQS以查看不同的方法)。然后,您可以连接另一个Lambda来处理此SQS消息并将其存储在DynamoDB中。您在DynamoDB中的对象将如下所示:
{
"id": "2511d862-53c1-48e2-beb4-ecc6c9deaac1",
"bucket": "my-processed-files-bucket",
"processedFileKey": "{some_identifier}_processed.txt"
}
这样,您就可以同时在Lambda和DynamoDB上规避有效负载大小,并在必要时仅基于processedFileKey
加载文件