使用AWS Lambda从AWS S3读取并提取巨大的zip文件

时间:2016-12-27 07:21:43

标签: node.js amazon-web-services amazon-s3 aws-lambda

我正在开发数据管理应用程序,客户可以在zip file(approx 250 MB)上上传多个text files(approx 1500 MB) AWS S3

但是由于aws lamda(最大1536MB大小)的内存有限,我能够提取(50 MB)的zip文件,并提取(500 MB)文件。

由于我需要在提取时对提取的文件添加一些验证,之后我必须将所有文件内容存储到数据库中。

目前我正在aws-lambda tmp location存储文件内容,其中也有最大500MB可以使用的限制。

任何有助于我通过验证执行上述任务的流式传输概念对我都有帮助。

我可以使用EC2, ECS,但现在我只想使用AWS-Lambda

使用此代码,我将解压缩并将zip文件上传到另一个S3存储桶。

像流式传输这样的任何其他概念都会对我有所帮助,因为我对流媒体概念不太熟悉,我在这里提出一些想法来解决我的问题。

s3.getObject(params, (err, data) => {
    if (err) {
        console.log('Error', err);
        var message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
        console.log(message);
        //  callback(message);
    } else {
        console.log('Started to buffer data');
        JSZip.loadAsync(data.Body).then(function(zip) {
            fs.writeFile('temp/hello.txt', 'New file added for testing');
            async.each(zip.files, function(item, cb1) {
                if (!item.dir && item.name.includes('nightly')) {
                    zip.file(item.name).async("text").then(function(content) {
                        fs.writeFile('temp/' + item.name.replace(/^.*[\\\/]/, ''), content, function(err) {
                            if (err) throw err;
                            cb1();
                        });
                    });
                } else {
                    cb1();
                }
            }, function(err, result) {
                var zipObj = new JSZip();
                fs.readdir('./temp', function(err, files) {
                    console.log(files);
                    async.each(files, function(file, cb2) {
                        fs.readFile('./temp/' + file, 'utf-8', function(err, content) {
                            if (err) {
                                return err;
                            }
                            zipObj.file(file, content);
                            cb2();
                        });
                    }, function(err) {
                        zipObj.generateAsync({
                                type: "nodebuffer"
                            })
                            .then(function(content) {
                                console.log(content);
                                deleteFiles(['./temp/*'], function(err, paths) {
                                    console.log('Deleted files/folders:\n', paths.join('\n'));
                                });

                                s3.putObject({
                                    Bucket: 'abtempb',
                                    Key: 'temp/records.zip',
                                    Body: content
                                }, function(err, result) {
                                    if (result && result.ETag) {
                                        console.log('uploaded file: ', result.ETag);
                                    }
                                    console.log('Error ', err);
                                });
                            });
                    });
                });
            });
        });
    }
});

谢谢

1 个答案:

答案 0 :(得分:0)

您现在可以在Lambda上装载EFS卷。可以在here中找到详细信息。