AWS Lambda与gm模块无法正常工作

9
我正在使用AWS Lambda,使用node js来调整我在s3 bucket中的图像大小,以生成不同尺寸的变体,当一个图像被放入s3 bucket时。

昨天还能工作。今天我使用相同的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)"
    ]
}

我无法理解为什么会出现这种现象。我下面的 lambda 函数中的所有给定函数都在 async waterfall 中,首先计算纵横比,然后将图像转换为不同大小的变体。

var request=require("request");

function getTheAspectRatio(callback) {
    gm(s3Url) // I am constructing the image url in the AWS Lambda Function.
        .size(function(err, size) {
            if (!err) {
                //Calculate the Aspect ratio
            } else if (err) {
                //Give Back the Error
              }
        });
}

function getTheImageBuffer(callback) {
    request(imageUrl, function(err, res, res1) {
        if (err) {
            callback(err);
        } else {
            buffer = res1;
            console.log("got the BUffer");
            callback(null);
        }

    });
}

function convertToThumbNail(callback) {
    //Convert to Thumbnail Image
}


function convertToFull(callback) {
    //Convert to Full Image
}

function convertToBadge(callback) {
   //Convert to Badge image

}

有人能帮忙调试这个问题吗?我已经卡在这里三个小时了。我的AWS Lambda位于东京地区。


从简单地阅读错误消息来看,似乎Lambda函数不再具有访问S3存储桶的权限。 - Mark B
5个回答

14

我曾经在一个运行了五周无误的进程中遇到了完全相同的错误信息。今天与AWS支持人员交谈后,我被告知由于最近发现的漏洞,Imagemagick的本地库支持已从AWS Lambda中删除,可在此处https://imagetragick.com/找到文档。

我被告知我必须重建Lambda函数并捆绑我的本地库版本- 可在此处https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/找到详情。

支持代表确认没有公开宣布这个更改。

TLDR:如果您一直使用的是依赖于Imagemagick捆绑版本的AWS Lambda函数,则自2016年5月4日起已无法使用,直到您重新部署自己构建和维护的库版本为止。愿原力与你同在...


你有一个兼容Lambda的构建源吗?不用自己创建一个会很好。 - frenchie4111

3
Mitch Shields是正确的,现在你必须自己构建/部署到AWS Lambda上。
我已经构建了一个适用于我的项目的版本,并且有一个NodeJS工具,可以将其下载到lambda实例中。构建的tarbal大小约为85mb,太大了无法与您的代码一起打包,因此您需要在运行之前将其下载到lambda中。它存储在/tmp/imagemagick中,Lambda尝试缓存/tmp/文件夹,因此您不需要在每次运行时下载它。
GitHub页面:https://github.com/DoubleDor/imagemagick-prebuilt 检查版本以获取构建ImageMagick的tarbal https://github.com/DoubleDor/imagemagick-prebuilt/releases

1

https://alas.aws.amazon.com/ALAS-2016-699.html

"注意:此更新包含一个已更新的 /etc/ImageMagick/policy.xml 文件,禁用了 EPHEMERAL、HTTPS、HTTP、URL、FTP、MVG、MSL、TEXT 和 LABEL 编码器。"
"我将我的调用从 gm(my_url) 更改为 gm(request(my_url)),似乎又可以正常工作了。也就是说,我将 request() 调用的流发送到 ImageMagick,而不是让 ImageMagick 尝试下载图像(这在 ImageMagick 的 policy.xml 中被禁用,我无法修改该文件)。"

1
根据AWS文档:http://docs.aws.amazon.com/pt_br/lambda/latest/dg/current-supported-versions.html AWS Lambda仍然支持imagemagick。
然而,我几天前遇到了同样的问题,这个项目之前一直运行良好。根据错误信息,似乎是在尝试读取S3存储桶时发生了权限冲突,而不是imagemagick的问题。
您可以尝试更改Bucket权限在Amazon S3中使一个Bucket公共
或者,作为解决方法,您可以始终将图像文件与Lambda文件一起压缩,避免此类权限冲突。

-1

看起来您的Lambda函数无法访问您的S3存储桶。请确保您的函数已应用相应的IAM策略,例如:

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

尽管您的问题与GraphicsMagick无关,请注意AWS Lambda只安装了ImageMagick。因此,除非您自己提供GraphicsMagick可执行文件,否则请确保使用ImageMagick子类:
var gm = require("gm").subClass({ imageMagick: true });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接