AWS Lambda不与gm模块一起使用

时间:2016-05-05 09:06:28

标签: amazon-web-services amazon-s3 imagemagick aws-lambda gm

当我将图片放入AWS Lambda时,我正在使用s3 buckets3 bucket中的图片调整为使用节点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)"
    ]
}

我无法理解为什么会出现这种现象。我下面的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

}

有人可以帮忙调试问题吗?在过去的3个小时里,我对此很感兴趣。我的AWS Lambda在东京地区。

5 个答案:

答案 0 :(得分:13)

我在过去5周一直运行良好的进程中发生了完全相同的错误消息。在今天与AWS支持人员交谈后,我被告知,由于最近在此处记录的漏洞https://imagetragick.com/,已从AWS Lambda中删除了对Imagemagick的本机库支持。

我被告知我必须重建我的Lambda函数并捆绑我自己的本机库版本 - https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

支持代表确认没有公开宣布这一变化。

TLDR:如果您使用的是依赖于Imagemagick版本捆绑的AWS Lambda函数,截至05/04/2016,它现在已损坏,在您使用自己的内置版本重新部署之前可能无法运行维护了库的版本。愿第四个和你在一起......

答案 1 :(得分:3)

Mitch Shields是正确的,您现在必须自己构建/部署到AWS Lambda。

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

GitHub页面:https://github.com/DoubleDor/imagemagick-prebuilt

检查构建ImageMagick https://github.com/DoubleDor/imagemagick-prebuilt/releases

的tarbal版本

答案 2 :(得分:1)

根据AWS文档:http://docs.aws.amazon.com/pt_br/lambda/latest/dg/current-supported-versions.html AWS Lambda仍支持imagemagick。

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

您可以尝试更改广告连播权限Make a bucket public in Amazon S3

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

答案 3 :(得分:1)

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

&#34;注意:此更新包含更新的/etc/ImageMagick/policy.xml文件,该文件禁用EPHEMERAL,HTTPS,HTTP,URL,FTP,MVG,MSL,TEXT和LABEL编码器&#34;

我将来电从gm(my_url)更改为gm(request(my_url)),事情似乎再次奏效。即我从request()调用ImageMagick发送一个流,而不是让ImageMagick尝试下载图像(在ImageMagick的policy.xml中禁用,这是我无法修改的文件)。

答案 4 :(得分:-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可执行文件,否则请确保使用imagemagic子类:

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