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

abd*_*rik 8 amazon-s3 amazon-web-services node.js 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);
                                });
                            });
                    });
                });
            });
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

谢谢

Ale*_*one -1

您现在可以在 Lambda 上挂载 EFS 卷。详细信息可以在这里找到。