如何在AWS Lambda处理程序中使用multer-s3作为中间件

时间:2018-08-04 07:15:09

标签: node.js amazon-s3 aws-lambda multipartform-data multer-s3

我正在尝试将 multipart / form-data 表单发送给 AWS-Lambda 方法。 我需要能够将文件发送到 S3 ,并且需要使用传入的字符串参数将元数据记录到RDS。

现在,我可以使用 express multer-s3 进行以下操作;

var express = require('express');
var AWS = require('aws-sdk');
var multer = require('multer')
var multerS3 = require('multer-s3')

var s3 = new AWS.S3();
const app = express();

var upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'my-bucket-name',
    metadata: function (req, file, cb) {
      cb(null, Object.assign({}, req.body));
    },
    key: function (req, file, cb) {
      cb(null, Date.now().toString() + '.fileExtension')
    }
  })
})

app.post('/data', upload.array('file'), function(req, res, next) {
  // here using req.files, i can save metadata to RDS
})

我的问题是,可以在AWS Lambda方法中使用multer-s3吗?如果答案是否定的,或者不建议这样做,请您指出正确的方向吗?

谢谢..

1 个答案:

答案 0 :(得分:1)

我知道问题发布已经有一段时间了,但是为了将来可能会在这里出现的人们:

简短答案:不建议使用。为什么?对于作为表单数据一部分发送的文件有一些奇怪的处理,不确定是通过API Gateway还是通过S3。我花了整整一天的时间尝试使用与您提到的方法类似的方法从SPA Angular应用程序上传图像,但我无法使其工作:我能够访问请求中的文件,该文件先前是Multer解析的,并有效地将它们放到S3存储桶中,但是图像损坏了。不知道它是否适用于其他类型的文件,但是这种方法需要更多的工作,而且感觉有些棘手。 从您的AWS账户外部(即不使用任何AWS Service或EC2实例)将文件上传到S3存储桶的最佳,最简便的方法是,IMO使用Presigned URLs。 您可以检查this article可能会指出正确的方向。

也就是说,您可以configure API Gateway to allow your Lambda to receive binary files。如果您使用的是无服务器,则以下是一个使事情变得更轻松的插件:https://github.com/maciejtreder/serverless-apigw-binary