当前位置: 首页 > 面试题库 >

使用Lambda节点从S3上的文件在S3上创建一个zip文件

阳航
2023-03-14
问题内容

我需要创建一个Zip文件,该文件由位于我的s3存储桶中的一系列文件(视频和图像)组成。

目前使用以下代码的问题是,我很快达到了Lambda的内存限制。

async.eachLimit(files, 10, function(file, next) {
    var params = {
        Bucket: bucket, // bucket name
        Key: file.key
    };
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log('file', file.key);
            console.log('get image files err',err, err.stack); // an error occurred
        } else {
            console.log('file', file.key);
            zip.file(file.key, data.Body);
            next();
        }
    });
}, 
function(err) {
    if (err) {
        console.log('err', err);
    } else {
        console.log('zip', zip);
        content = zip.generateNodeStream({
            type: 'nodebuffer',
            streamFiles:true
        });
        var params = {
            Bucket: bucket, // name of dest bucket
            Key: 'zipped/images.zip',
            Body: content
        };
        s3.upload(params, function(err, data) {
            if (err) {
                console.log('upload zip to s3 err',err, err.stack); // an error occurred
            } else {
                console.log(data); // successful response
            }
        });
    }
});
  • 使用Lambda是否有可能,还是我应该采用其他方法?

  • 是否可以即时写入压缩的zip文件,从而在某种程度上消除内存问题,还是我需要在压缩之前收集文件?

任何帮助将非常感激。


问题答案:

好的,我今天必须这样做,并且可以正常工作。直接缓冲区到流,不涉及磁盘。因此,内存或磁盘限制在这里不会成为问题:

'use strict';



const AWS = require("aws-sdk");

AWS.config.update( { region: "eu-west-1" } );

const s3 = new AWS.S3( { apiVersion: '2006-03-01'} );



const   _archiver = require('archiver');



//This returns us a stream.. consider it as a real pipe sending fluid to S3 bucket.. Don't forget it

const streamTo = (_bucket, _key) => {

    var stream = require('stream');

    var _pass = new stream.PassThrough();

    s3.upload( { Bucket: _bucket, Key: _key, Body: _pass }, (_err, _data) => { /*...Handle Errors Here*/ } );

    return _pass;

};



exports.handler = async (_req, _ctx, _cb) => {

    var _keys = ['list of your file keys in s3'];



    var _list = await Promise.all(_keys.map(_key => new Promise((_resolve, _reject) => {

            s3.getObject({Bucket:'bucket-name', Key:_key})

                .then(_data => _resolve( { data: _data.Body, name: `${_key.split('/').pop()}` } ));

        }

    ))).catch(_err => { throw new Error(_err) } );



    await new Promise((_resolve, _reject) => {

        var _myStream = streamTo('bucket-name', 'fileName.zip');        //Now we instantiate that pipe...

        var _archive = _archiver('zip');

        _archive.on('error', err => { throw new Error(err); } );



        //Your promise gets resolved when the fluid stops running... so that's when you get to close and resolve

        _myStream.on('close', _resolve);

        _myStream.on('end', _resolve);

        _myStream.on('error', _reject);



        _archive.pipe(_myStream);           //Pass that pipe to _archive so it can push the fluid straigh down to S3 bucket

        _list.forEach(_itm => _archive.append(_itm.data, { name: _itm.name } ) );       //And then we start adding files to it

        _archive.finalize();                //Tell is, that's all we want to add. Then when it finishes, the promise will resolve in one of those events up there

    }).catch(_err => { throw new Error(_err) } );



    _cb(null, { } );        //Handle response back to server

};


 类似资料:
  • 我是aws lambda(节点)函数的新手,我使用s3获取文件对象。getObject()函数,但在获取文件后如何在lambda函数中生成zip我不知道。。。 任何人都能帮我,如何制作zip文件并上传到s3 bucket上。

  • 这段代码既不写文件,也不给我一个错误,这是日志: 开始请求ID:7c93b1b9-73c1-4f18-9824-095bcbe292bf版本:$最新结束请求ID:7c93b1b9-73c1-4f18-9824-095bcbe292bf报告请求ID:7c93b1b9-73c1-4f18-9824-095bcbe292bf持续时间:706.18 ms计费持续时间:800 ms内存大小:128 MB最大

  • 我是亚马逊和java的新手。我在这里尝试两件事。 第一-我试图在我的Amazon S3存储桶中创建一个文件夹,我已经创建并获得了凭据。 第二-我正在尝试将文件上传到这个存储桶。 根据我的理解,我可以使用putObjectRequest()方法来完成这两个任务。 用于上传文件。 我不确定我是否应该使用这种方法 仅用于创建文件夹。我正在努力学习InputSteam和ObjectMetadata。我不知

  • 我正在LinuxAcademy网站上做一个实验室。com课程名称是使用Lambda、Python和Boto3自动化自动气象站,我遇到问题的具体实验室是讲座:将CSV文件导入DynamoDB。 在这个实验室中,我们将一个. csv文件上传到S3,在该特定桶中生成一个S3事件,然后启动如下所示的Lambda脚本: 上传到s3的.csv文件确实调用了lambda函数。第20行出现错误: AWS Clou

  • 我正在使用Node上传mp3文件到亚马逊S3。当我上传它时,文件大小是9.0字节,当我转到公共url时,音频文件不会播放。这就是我所拥有的, 我也将权限设置为公共访问。

  • 我正在尝试使用读取aws s3存储桶中的文件 我已经能够使用节点aws-sdk下载和上传文件,但是我不知道如何简单地读取它并解析内容。 下面是我如何从s3读取文件的示例: