如何使用 Lambda /API Gateway 在 S3 上上传大于 10MB 的 csv 文件

Posted

技术标签:

【中文标题】如何使用 Lambda /API Gateway 在 S3 上上传大于 10MB 的 csv 文件【英文标题】:How to Upload a csv file lager than 10MB on S3 using Lambda /API Gateway 【发布时间】: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")
    );

【问题讨论】:

【参考方案1】:

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

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

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

总而言之,该过程将是:

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

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

【讨论】:

感谢您的支持。我在我的 lambda 上使用 node.js。有没有可以让我了解实施的示例 ***.com/questions/38831829/… 一个细节:如果你在 lambda 中运行它,你不需要调用 AWS.config.update 你好,我已经创建了一个签名的URL Lambda,但是当我在邮递员上测试它时,仍然是文件 "message":"Request Entity Too Large" 在该建议中,您不要将文件发送到 api 网关。您将文件发送到签名的 url。您可以在 github gist 或此处的其他答案中分享您的 lambda 代码吗?

以上是关于如何使用 Lambda /API Gateway 在 S3 上上传大于 10MB 的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将事件信息从 aws API Gateway get 传递给 Lambda?

如何定义 Lambda 变量以通过 API Gateway 查询 Redshift

如何授予 API Gateway 通过 CloudFormation 调用 lambda 函数的权限?

我的带有 lambda 函数的 AWS API Gateway REST API 返回 Null,如何解决这个问题?

如何调试 AWS Api Gateway 和 Lambda 的“AWS/ApiGateway 5XXError”

如何在没有授权人的情况下通过 API Gateway 使 AWS Cognito 用户数据可供 Lambda 使用?