将图像从 lambda 上传到 s3(损坏的文件)

sam*_*yst 4 amazon-s3 express aws-lambda serverless-framework

我创建了一个 node express 应用程序,它使用multer将图像上传到我的“assets-in”s3 存储桶。图像上传到 s3 后,图像处理 lambda 函数会获取图像并将其调整为另一个 s3 存储桶。

上传脚本:

var assetsBucketIn = new AWS.S3({
  accessKeyId     : "...",
  secretAccessKey : "...",
  region          : "...",
  params : {
    Bucket : "..."
  }
});

var uploadAssets     = multer({inMemory : true});
var imgFieldSettings = [
  {
    name     : 'uploadFiles',
    maxCount : 7
  }
];

router.post('/images', uploadAssets.fields(imgFieldSettings), (req, res, next) => {
  ...
  uploadPromises = [];
  for(let i = 0; i < req.files.uploadFiles.length; i++){
    let params = {
      Key  : path.join(srcPath, srcName),
      Body : req.files.uploadFiles[i].buffer
    };
    let uploadPromise = assetsBucketIn.upload(params).promise();
    uploadPromises.push(uploadPromise);
  }

  Promise.all(uploadPromises)
   .then(...).catch(...);
Run Code Online (Sandbox Code Playgroud)

我可以在本地主机上运行这个 express 应用程序而没有任何问题,但是当我使用aws-serverless-express通过 lambda 运行 express 应用程序时,我无法访问图像(拒绝访问)并且图像处理 lambda 函数给了我以下日志错误:

类型错误:无法读取 gm 处未定义的属性“宽度”。(/var/task/index.js:103:50) at emitMany (events.js:127:13) at gm.emit (events.js:201:7) at gm。(/var/task/node_modules/gm/lib/getters.js:70:16) 在 cb (/var/task/node_modules/gm/lib/command.js:322:16) 在 ChildProcess.onExit (/var/ task/node_modules/gm/lib/command.js:305:9) at emitTwo (events.js:106:13) at ChildProcess.emit (events.js:191:7) at mayClose (internal/child_process.js:886) :16) 在套接字。(内部/child_process.js:342:11)

gm是节点的 GraphicsMagick 和 ImageMagick 模块

我想问题出在 express 应用程序中,我使用serverless在 aws lambda 上运行该应用程序。也许它的 multer 设置有问题,它与 lambda 环境发生冲突?顺便说一下,我的 assetsBucket 具有“AmazonS3FullAccess”角色。


更新:

实际上,我刚刚发现问题不在于访问权限,没关系,公共访问被拒绝(请注意误导性信息)。当我下载上传到我的资产存储桶的图像时,我无法打开它并收到以下错误代码:

解释 JPEG 图像文件时出错(不是 JPEG 文件:以 0xef 0xbf 开头)

但是只有当我使用 aws lambda(无服务器)上传图片时,我才会收到此错误,当我在本地运行上传过程时,文件似乎一切正常,因此通过 lambda 上传时文件以某种方式损坏

Jua*_*ata 6

就我而言,这是 API Gateway 故障,事实证明您必须启用二进制支持,否则,lambda 函数将永远不会收到二进制内容:

  1. 转到 ApiGateway 端点的设置
  2. 转到二进制媒体类型
  3. 添加新的二进制类型并放入:image/jpg

此外,如果您的 Lambda 函数位于 VPC 和安全组之后,请首先检查它是否在没有 VPC 的情况下工作。