2016-05-05 32 views
6

我正在使用AWS Lambdas3 bucket中的圖像調整爲使用節點js的不同大小變體,當圖像放入s3 bucket時。AWS Lambda不能與gm模塊一起使用

它一直工作到昨天。今天當我使用相同的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在東京地區。

+0

從簡單閱讀錯誤消息看來,Lambda函數不再有權訪問S3存儲桶。 –

回答

10

我有相同的錯誤信息會出現對已在最近5周完美運行的進程。今天在與AWS支持部門交流之後,我被告知,由於最近發現的漏洞是https://imagetragick.com/,因此Imagemagick的本地庫支持已從AWS Lambda中移除。

有人告訴我,我將不得不重建我的lambda函數,在我自己的本機庫的版本捆綁 - https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

支持代表確認,不曾有過這種變化的公告。

TLDR:如果您使用的是依賴於Imagemagick版本的AWS Lambda函數,截至2016年4月5日,它現在已經損壞,並且可能無法運行,直到您用自己的內置並維護了該庫的版本。可能第四次與你...

+0

你有一個lambda兼容版本的源代碼嗎?很高興不必自己創建一個。 – frenchie4111

-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 }); 
3

米奇盾是正確的,你現在必須自己建立/部署到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

1

的tarbal按照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文件壓縮圖像文件,並避免此類權限衝突。

1

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

「注意:此更新包含禁用短暫的,HTTPS,HTTP,網址,FTP,MVG,MSL,TEXT和標籤編碼器更新/etc/ImageMagick/policy.xml文件」

我把我的電話從gm(my_url)更改爲gm(request(my_url)),事情似乎再次起作用。 I.e我從request()調用發送一個流到ImageMagick,而不是讓ImageMagick嘗試下載圖像(ImageMagick的policy.xml中禁用該圖像,這是一個我無法修改的文件)。