【问题标题】:How to Upload a csv file lager than 10MB on S3 using Lambda /API Gateway如何使用 Lambda /API Gateway 在 S3 上上传大于 10MB 的 csv 文件
【发布时间】:2020-11-30 19:16:20
【问题描述】:

您好,我是 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")
    });
}

【问题讨论】:

    标签: amazon-s3 aws-lambda aws-api-gateway


    【解决方案1】:

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

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

    问题是:您如何以安全的方式执行此操作,而不向互联网上的所有人开放您的 S3 存储桶并向其中上传任何内容?您使用 s3 签名的网址。签名 URL 是 S3 的一项功能,它允许您在 URL 中烘焙正确的权限,以将对象上传到安全存储桶。

    总而言之,该过程将是:

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

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

    【讨论】:

    • 感谢您的支持。我在我的 lambda 上使用 node.js。有没有可以让我了解实施的示例
    • 一个细节:如果你在 lambda 中运行它,你不需要调用 AWS.config.update
    • 你好,我已经创建了一个签名的URL Lambda,但是当我在邮递员上测试它时,仍然是文件 {"message":"Request Entity Too Large"}
    • 在该建议中,您不要将文件发送到 api 网关。您将文件发送到签名的 url。您可以在 github gist 或此处的其他答案中分享您的 lambda 代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多