处理Lambda的大型S3文件的方法是什么?

时间:2019-03-18 08:17:55

标签: amazon-s3 aws-lambda

在项目中,需要处理记录为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);
        }
    }

1 个答案:

答案 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加载文件