AWS Lambda 不与 gm 模块一起工作
AWS Lambda not working along with the gm module
我正在使用 AWS Lambda to resize my image in s3 bucket into different size variants using node js when an image is put into the 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
}
有人可以帮助调试问题吗?在过去的 3 hours.My 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 sub class:
var gm = require("gm").subClass({ imageMagick: true });
我在过去 5 周 运行 完美无缺的流程中出现了完全相同的错误消息。在今天与 AWS 支持人员交谈后,我得知由于最近发现的漏洞 https://imagetragick.com/.
,AWS Lambda 中删除了对 Imagemagick 的本地库支持
我被告知我必须重建我的 Lambda 函数并捆绑到我自己的本机库版本中 - https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/
支持代表确认 public 没有关于此更改的公告。
TLDR:如果您一直在使用依赖于 Imagemagick 捆绑版本的 AWS Lambda 函数,截至 2016 年 5 月 4 日,它现在已损坏并且可能无法工作,直到您重新部署自己的库的构建和维护版本。愿第四与你同在...
Mitch Shields 是正确的,您现在必须自己构建/部署它到 AWS Lambda。
我已经构建了一个适用于我的项目的版本,以及一个将其下载到 lambda 实例的 NodeJS 工具。构建的 tarbal 约为 85mb,太大而无法与您的代码打包,因此您必须在 运行ning 之前将其下载到 lambda 上。它存储在 /tmp/imagemagick
中,lambda 尝试缓存 /tmp/
文件夹,因此您不需要在每个 运行.
上下载它
GitHub 页数:https://github.com/DoubleDor/imagemagick-prebuilt
检查构建 ImageMagick 压缩包的版本 https://github.com/DoubleDor/imagemagick-prebuilt/releases
根据 AWS 文档:http://docs.aws.amazon.com/pt_br/lambda/latest/dg/current-supported-versions.htmlAWS Lambda 仍然支持 imagemagick。
但是,几天前我遇到了同样的问题,一个项目运行完美。由于错误消息的问题,它似乎是在尝试读取 S3 存储桶时发生权限冲突而不是 imagemagick 问题。
您可以尝试更改 Bucket 权限 Make a bucket public in Amazon S3。
或者,作为一种解决方法,您始终可以将图像文件与您的 lambda 文件一起压缩,从而避免此类权限冲突。
https://alas.aws.amazon.com/ALAS-2016-699.html
"Note: This update contains an updated /etc/ImageMagick/policy.xml file that disables the EPHEMERAL, HTTPS, HTTP, URL, FTP, MVG, MSL, TEXT, and LABEL coders"
我将呼叫从 gm(my_url)
更改为 gm(request(my_url))
,一切似乎又恢复正常了。即我从 request() 调用向 ImageMagick 发送一个流,而不是让 ImageMagick 尝试下载图像(在 ImageMagick 的 policy.xml 中被禁用,我无法修改该文件)。
我正在使用 AWS Lambda to resize my image in s3 bucket into different size variants using node js when an image is put into the 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
}
有人可以帮助调试问题吗?在过去的 3 hours.My 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 sub class:
var gm = require("gm").subClass({ imageMagick: true });
我在过去 5 周 运行 完美无缺的流程中出现了完全相同的错误消息。在今天与 AWS 支持人员交谈后,我得知由于最近发现的漏洞 https://imagetragick.com/.
,AWS Lambda 中删除了对 Imagemagick 的本地库支持我被告知我必须重建我的 Lambda 函数并捆绑到我自己的本机库版本中 - https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/
支持代表确认 public 没有关于此更改的公告。
TLDR:如果您一直在使用依赖于 Imagemagick 捆绑版本的 AWS Lambda 函数,截至 2016 年 5 月 4 日,它现在已损坏并且可能无法工作,直到您重新部署自己的库的构建和维护版本。愿第四与你同在...
Mitch Shields 是正确的,您现在必须自己构建/部署它到 AWS Lambda。
我已经构建了一个适用于我的项目的版本,以及一个将其下载到 lambda 实例的 NodeJS 工具。构建的 tarbal 约为 85mb,太大而无法与您的代码打包,因此您必须在 运行ning 之前将其下载到 lambda 上。它存储在 /tmp/imagemagick
中,lambda 尝试缓存 /tmp/
文件夹,因此您不需要在每个 运行.
GitHub 页数:https://github.com/DoubleDor/imagemagick-prebuilt
检查构建 ImageMagick 压缩包的版本 https://github.com/DoubleDor/imagemagick-prebuilt/releases
根据 AWS 文档:http://docs.aws.amazon.com/pt_br/lambda/latest/dg/current-supported-versions.htmlAWS Lambda 仍然支持 imagemagick。
但是,几天前我遇到了同样的问题,一个项目运行完美。由于错误消息的问题,它似乎是在尝试读取 S3 存储桶时发生权限冲突而不是 imagemagick 问题。
您可以尝试更改 Bucket 权限 Make a bucket public in Amazon S3。
或者,作为一种解决方法,您始终可以将图像文件与您的 lambda 文件一起压缩,从而避免此类权限冲突。
https://alas.aws.amazon.com/ALAS-2016-699.html
"Note: This update contains an updated /etc/ImageMagick/policy.xml file that disables the EPHEMERAL, HTTPS, HTTP, URL, FTP, MVG, MSL, TEXT, and LABEL coders"
我将呼叫从 gm(my_url)
更改为 gm(request(my_url))
,一切似乎又恢复正常了。即我从 request() 调用向 ImageMagick 发送一个流,而不是让 ImageMagick 尝试下载图像(在 ImageMagick 的 policy.xml 中被禁用,我无法修改该文件)。