如何使用Lambda/API网关在S3上上载大于10MB的csv文件



你好,我是AWS的新手,我试图在我的bucket s3上上传一个csv文件,但当文件大于10mb时,它会返回";{"消息":"请求实体太大"};我用邮递员来做这件事。以下是我创建的当前代码,但在未来我将添加一些验证,以更改上传到我格式的文件的名称。有什么方法可以用这种代码做到这一点吗?或者你有什么建议可以帮助我解决我遇到的问题吗?

const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const bucket = process.env.UploadBucket;
const prefix = "csv-files/";
const filename = "file.csv";

exports.handler = (event, context, callback) => {
let data = event.body;
let buff = new Buffer(data, 'base64');
let text = buff.toString('ascii');

console.log(text);

let textFileSplit = text.split('?');
//get filename split
let getfilename = textFileSplit[0].split('"');

console.log(textFileSplit[0]);
console.log(textFileSplit[1]);
//   //remove lower number on csv
let csvFileSplit = textFileSplit[1].split('--')


const params = {
Bucket: bucket,
Key: prefix + getfilename[3],
Body: csvFileSplit[0]
};
s3.upload(params, function (err, data) {
if (err) {
console.log('error uploading');
callback(err);
}
console.log("Uploaded")
callback(null, "Success")
});
}

对于像这样的场景,我们通常使用不同的方法。

不是通过API网关将文件发送到lambda,而是将文件直接发送到S3。这将使您的解决方案更健壮,成本更低,因为您不需要将数据传输到API网关,也不需要处理lambda中的整个文件。

问题是:如何以安全的方式做到这一点,而不向互联网上的每个人打开S3 Bucket并上传任何内容?您使用s3签名的url。签名url是S3的一个功能,它允许您在url中烘焙将对象上传到安全存储桶的正确权限。

总之,该过程将是:

  1. 前端向API网关发送请求
  2. API网关将请求转发到Lambda功能
  3. Lambda函数生成一个签名的Url,该Url具有将对象上传到特定s3 bucket的权限
  4. API网关将Lambda函数的响应发送回前端。前端将文件上载到已签名的Url

要生成签名的url,您需要在lambda函数中使用普通的aws-sdk。在那里,您将调用方法getSignedUrl(签名取决于您的语言(。你可以在这里找到更多关于签名网址的信息。

最新更新