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

问题描述

您好,我是AWS上的新用户,我试图在我的存储桶s3中上传一个csv文件,但是当文件大于10mb时,它正在重播“ {“ message”:“ Request Entity Too Large”}}我正在使用邮递员要这样做。以下是我创建的当前代码,但是在将来,我将添加一些验证以更改要上载为格式的文件的名称。可以使用这种代码来执行此操作吗?或者,如果您有任何建议可以帮助我解决遇到的问题,那么该如何解决?

   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")
    });
}

解决方法

对于这种情况,我们通常使用不同的方法。

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

问题是:如何以安全的方式做到这一点,而又不向互联网上的所有人打开S3存储桶并向其中上传任何内容?您使用s3签名的URL。带签名的网址是S3的一项功能,可让您在url中烘焙正确的权限,以将对象上传到受保护的存储桶。

总的来说,该过程将是:

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

要生成签名的URL,您将需要在lambda函数中使用常规的aws-sdk。在那里,您将调用方法getSignedUrl(签名取决于您的语言)。您可以找到有关签名URL here的更多信息。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...