9

当将图像放入 s3 存储桶时,我正在使用 AWS Lambda 使用节点 js 将 s3 存储桶中的图像调整为不同大小体。

它一直工作到昨天。今天,当我使用相同的 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 函数的所有给定函数都在异步瀑布中,首先计算纵横比,然后将图像转换为不同大小的变体。

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 在东京地区。

4

5 回答 5

14

我在过去 5 周完美运行的进程上出现了完全相同的错误消息。在今天与 AWS 支持人员交谈后,我获悉,由于最近发现的漏洞记录在这里https://imagetragick.com/ ,已从 AWS Lambda 中删除了对 Imagemagick 的本机库支持。

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

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

TLDR:如果您一直在使用依赖于 Imagemagick 捆绑版本的 AWS Lambda 函数,截至 2016 年 5 月 4 日,它现在已损坏,并且可能无法工作,直到您使用自己构建和维护的版本重新部署图书馆。愿四爷与你同在...

于 2016-05-05T21:06:40.293 回答
3

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

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

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

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

于 2016-05-19T20:33:13.613 回答
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)to更改为gm(request(my_url)),事情似乎又恢复了。即我从 request() 调用向 ImageMagick 发送一个流,而不是让 ImageMagick 尝试下载图像(在 ImageMagick 的 policy.xml 中禁用,这是一个我无法修改的文件)。

于 2016-07-01T02:27:57.223 回答
1

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

但是,几天前我遇到了同样的问题,我的项目运行完美。由于错误消息的问题,在尝试读取 S3 存储桶时似乎是权限冲突,而不是 imagemagick 问题。

您可以尝试更改存储桶权限在 Amazon S3 中公开存储桶

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

于 2016-06-06T14:30:07.903 回答
-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 });
于 2016-05-05T18:30:20.813 回答