Amazon web services AWS Lambda不与gm模块一起工作

Amazon web services AWS Lambda不与gm模块一起工作,amazon-web-services,amazon-s3,imagemagick,aws-lambda,gm,Amazon Web Services,Amazon S3,Imagemagick,Aws Lambda,Gm,我正在使用node js将我的图像调整为不同大小的变体,当图像被放入中时 它一直工作到昨天。今天,当我使用相同的lambda函数时,出现以下错误: { "errorMessage": "Command failed: identify: not authorized `//bucketname.s3.amazonaws.com/imagename.jpg' @ error/constitute.c/ReadImage/454.\n", "errorType": "Error", "stackTr

我正在使用node js将我的图像调整为不同大小的变体,当图像被放入中时

它一直工作到昨天。今天,当我使用相同的lambda函数时,出现以下错误:

{
"errorMessage": "Command failed: identify: not authorized `//bucketname.s3.amazonaws.com/imagename.jpg' @ error/constitute.c/ReadImage/454.\n",
"errorType": "Error",
"stackTrace": [
    "",
    "ChildProcess.proc.on.onExit (/var/task/node_modules/gm/lib/command.js:297:17)",
    "emitTwo (events.js:87:13)",
    "ChildProcess.emit (events.js:172:7)",
    "maybeClose (internal/child_process.js:821:16)",
    "Socket.<anonymous> (internal/child_process.js:319:11)",
    "emitOne (events.js:77:13)",
    "Socket.emit (events.js:169:7)",
    "Pipe._onclose (net.js:469:12)"
    ]
}

有人能帮忙调试这个问题吗?在过去的3个小时里,我一直在关注这个问题。我的AWS Lambda在东京地区

您的Lambda函数似乎无法访问S3存储桶。确保您的职能部门应用了相应的IAM策略,例如:

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "s3:GetObject",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::*"
        ]
    }]
}

尽管您的问题与graphicsmagick无关,但请注意AWS Lambda仅随imagemagick一起安装。因此,除非您自己提供graphicsmagick可执行文件,否则请确保使用imagemagic子类:

var gm = require("gm").subClass({ imageMagick: true });

在一个过去5周一直完美运行的进程上,出现了完全相同的错误消息。在今天与AWS支持人员交谈后,我得知,由于最近在此处发现的漏洞,针对Imagemagick的本机库支持已从AWS Lambda中删除

我被告知必须在我自己版本的本机库中重建Lambda函数和包-

支持代表确认,尚未公开宣布这一变化


TLDR:如果从2016年4月5日起,您一直在使用依赖于Imagemagick捆绑版本的AWS Lambda函数,则该函数现在已损坏,在您使用自己构建和维护的库版本重新部署之前可能无法工作。愿第四个与你同在……

米奇·希尔兹是正确的,你现在必须自己在AWS Lambda上构建/部署它

我已经构建了一个适用于我的项目的版本,以及一个可以下载到lambda实例的NodeJS工具。构建的tarbal约为85mb,太大,无法与代码打包,因此您必须在运行之前将其下载到lambda上。它存储在
/tmp/imagemagick
中,lambda尝试缓存
/tmp/
文件夹,因此您不必每次运行时都下载它

GitHub页面:


根据AWS文档检查构建ImageMagick的tarbal版本:AWS Lambda仍然支持ImageMagick

然而,几天前我遇到了同样的问题,一个工作完美的项目。当错误消息发出时,在尝试读取S3存储桶时,似乎是权限冲突,而不是imagemagick问题

您可以尝试更改Bucket权限

或者,作为一种解决方法,您可以始终使用lambda文件压缩图像文件,并避免此类权限冲突

注意:此更新包含一个更新的/etc/ImageMagick/policy.xml文件,该文件禁用临时、HTTPS、HTTP、URL、FTP、MVG、MSL、文本和标签编码器


我把电话从
gm(我的url)
改为
gm(请求(我的url))
,事情似乎又开始运转了。也就是说,我从request()调用向ImageMagick发送一个流,而不是让ImageMagick尝试下载图像(这在ImageMagick的policy.xml中是禁用的,我无法修改该文件).

从简单地读取错误消息来看,Lambda函数似乎不再具有对S3存储桶的访问权限。您是否有与Lambda兼容的版本的源代码?不必自己创建一个会很好。
var gm = require("gm").subClass({ imageMagick: true });