我创建了一个节点快递应用,它使用multer将图像上传到我的资产中#34; 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(...);
我可以在localhost上运行这个快速应用程序而没有任何问题,但是当我使用aws-serverless-express运行lambda的快速应用程序时,我无法访问该图像(拒绝访问)和图像处理lambda函数给出了以下日志错误:
TypeError:无法读取属性&#39; width&#39;未定义的gm。 (/var/task/index.js:103:50)at emitMany(events.js:127:13)at gm.emit (events.js:201:7)在gm。 (/ var /task/node_modules/gm/lib/getters.js:70:16)在cb (/var/task/node_modules/gm/lib/command.js:322:16)at at ChildProcess.onExit(/var/task/node_modules/gm/lib/command.js:305:9) 在ChildProcess.emit的emitTwo(events.js:106:13)(events.js:191:7) 在Socket的maybeClose(internal / child_process.js:886:16)。 (内部/ child_process.js:342:11)
gm是节点
的GraphicsMagick和ImageMagick模块我想问题出在快递应用程序中,我使用serverless在aws lambda上运行。也许它与multer设置有问题,这与lambda环境有冲突?我的assetsBucket拥有&#34; AmazonS3FullAccess&#34;顺便说一句。
更新
实际上我刚刚发现问题不是访问权限,没关系,公共访问被拒绝(sry for the missleading information)。当我下载上传到我的资产桶的图像时,我无法打开它并获得以下错误代码:
解释JPEG图像文件时出错(不是JPEG文件:以0xef开头 为0xBF)
但是,只有当我使用aws lambda(无服务器)上传图片时,我才会收到此错误,当我在本地运行上传过程时,文件的一切似乎都很好,所以不知何故< strong>通过lambda上传时文件损坏
答案 0 :(得分:3)
在我的情况下,它是API网关故障,事实证明你必须启用二进制支持,否则,lambda函数永远不会收到二进制内容:
此外,如果您的Lambda功能位于VPC和安全组之后,请首先检查它是否在没有VPC的情况下工作。