我需要创建一个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读取文件的示例: