2016-05-05 14 views
6

Używam AWS Lambda do zmiany rozmiaru obrazu w s3 bucket na warianty o różnych rozmiarach za pomocą węzła js, gdy obraz jest wstawiany do s3 bucket.AWS Lambda nie działa razem z modułem gm

To działało do wczoraj. Dzisiaj, kiedy używam tej samej funkcji lambda, pojawia się następujący błąd:

{ 
"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)" 
    ] 
} 

Nie jestem w stanie zrozumieć, dlaczego to zjawisko wystąpiło. Wszystkie podane funkcje mojej funkcji lambda poniżej są w async waterfall, aby najpierw obliczyć współczynnik kształtu, a następnie przekonwertować obraz na warianty o różnych rozmiarach.

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 

} 

Czy ktoś może pomóc w debugowaniu problemu? Trochę utknąłem na tym przez ostatnie 3 godziny. Moja AWS Lambda znajduje się w regionie Tokio.

+0

Z prostego czytania komunikatu o błędzie wynika, że ​​funkcja Lambda nie ma już dostępu do wiadra S3. –

Odpowiedz

10

miałem dokładnie ten sam komunikat o błędzie występuje na procesie, który został uruchomiony bezawaryjnie przez ostatnie 5 tygodni. Po dzisiejszym rozmowie z obsługą AWS poinformowano mnie, że obsługa biblioteki natywnej dla Imagemagick została usunięta z AWS Lambda ze względu na lukę, którą niedawno znaleziono udokumentowano tutaj https://imagetragick.com/.

powiedziano mi, że będę musiał odbudować moją funkcję lambda i pakiet w mojej własnej wersji natywnej biblioteki - https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

Przedstawiciel wsparcie potwierdził, że nie było publiczne ogłoszenie o tej zmianie.

TLDR: Jeśli korzystałeś z funkcji AWS Lambda, która była zależna od dołączonej wersji Imagemagick, stan na 05.04.2016, jest teraz zepsuty i prawdopodobnie nie będzie działał, dopóki nie przeniesiesz swojej własnej wersji i utrzymana wersja biblioteki. Niech czwarty będzie z tobą ...

+0

Czy masz źródło kompilacji zgodnej z lambda? Byłoby miło, gdybyś sam nie musiał go tworzyć. – frenchie4111

-1

Wygląda na to, że twoja funkcja Lambda nie ma dostępu do twojego kubełka S3. Upewnij się, że funkcja ta nakładana jest zgodnie polityka IAM, np .:

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

Chociaż Twój problem nie ma nic wspólnego z GraphicsMagick pamiętać, że AWS Lambda pochodzi tylko z zainstalowanym ImageMagick. Więc jeśli nie podasz wykonywalne GraphicsMagick się upewnić używać ImageMagick klasy sub:

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

Mitch Shields jest poprawny, musisz teraz zbudować/wdrożyć go samodzielnie na AWS Lambda.

Zbudowałem wersję, która działa dla mojego projektu i narzędzie NodeJS, które pobierze ją do instancji lambda. Zbudowany tarbal jest ~ 85mb, który jest zbyt duży, by spakować go z kodem, więc musisz go pobrać na lambdę przed uruchomieniem. Jest przechowywany w /tmp/imagemagick, lambda próbuje buforować folder /tmp/, więc nie powinieneś go pobierać przy każdym uruchomieniu.

GitHub Strona: https://github.com/DoubleDor/imagemagick-prebuilt

Sprawdź uwalnia do tarbal kompilacji ImageMagick https://github.com/DoubleDor/imagemagick-prebuilt/releases

1

Zgodnie z dokumentacją: http://docs.aws.amazon.com/pt_br/lambda/latest/dg/current-supported-versions.html AWS AWS Lambda ImageMagick wciąż wspiera.

Jednak miałem ten sam problem kilka dni temu, z projektem, który działał bez zarzutu. Podczas wyświetlania komunikatów o błędach wydaje się, że konflikt uprawnień podczas próby odczytu wiadra S3, a nie problemu z imagemagick.

Możesz spróbować zmienić uprawnienia Bucket Make a bucket public in Amazon S3.

Alternatywnie jako obejście, możesz zawsze skompresować pliki obrazów za pomocą pliku lambda i uniknąć takich powiązań uprawnień.

1

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

"Uwaga: Ta aktualizacja zawiera zaktualizowany plik /etc/ImageMagick/policy.xml że wyłącza efemeryczne, HTTPS, HTTP, FTP URL mvg, MSL, tekst i koderów label"

Zmieniłem swój telefon z gm(my_url) na gm(request(my_url)) i wszystko wydaje się znów działać. Np. Wysyłam strumień z wywołania request() do ImageMagick zamiast pozwalać ImageMagick'owi próbować pobrać obraz (który jest wyłączony w PolicyMagick's policy.xml, pliku, którego nie mogę zmodyfikować).