Jak załadować moduły npm w AWS Lambda?

147

Stworzyłem kilka funkcji Lambda za pomocą edytora internetowego. Na razie w porządku. Chciałbym teraz zacząć rozszerzać te o moduły (takie jak Q dla obietnic). Nie mogę wymyślić, jak przenieść moduły do ​​Lambda, aby mogły zostać wykorzystane przez moje funkcje.

Przeczytałem to, ale wydaje się, że wymaga to skonfigurowania EC2 i uruchomienia funkcji Lambda z tego miejsca. Istnieje mechanizm przesyłania pliku ZIP podczas tworzenia funkcji, ale wydaje się, że wymaga on wysyłania funkcji opracowanych lokalnie. Ponieważ pracuję w edytorze internetowym, wydaje się to dziwnym przepływem pracy.

Jak mogę po prostu wdrożyć niektóre moduły do ​​wykorzystania w moich funkcjach Lambda?

Fook
źródło
7
Wszystko jest wyjaśnione w dokumentach tutaj - docs.aws.amazon.com/lambda/latest/dg/ ...
arcseldon

Odpowiedzi:

196

Nie możesz załadować modułów NPM bez przesłania .zippliku, ale w rzeczywistości możesz sprowadzić ten proces do dwóch szybkich linii poleceń.

Oto jak:

  1. Umieść pliki funkcji Lambda w osobnym katalogu. Dzieje się tak, ponieważ npmlokalnie instalujesz pakiety dla Lambda i chcesz mieć możliwość wyodrębnienia i przetestowania tego, co załadujesz do Lambda.

  2. Zainstaluj pakiety NPM lokalnie npm install packageNamew oddzielnym katalogu Lambda utworzonym w kroku 1.

  3. Upewnij się, że Twoja funkcja działa, gdy działa lokalnie: node lambdaFunc.js(możesz po prostu export.handlerzakomentować dwie linie w kodzie, aby dostosować kod do lokalnego działania z Node).

  4. Przejdź do katalogu Lambda i skompresuj zawartość , upewnij się, że nie zawiera samego katalogu.

    zip -r lambdaFunc.zip .
    
  5. Jeśli masz aws-clizainstalowany, co sugeruję, jeśli chcesz ułatwić sobie życie, możesz teraz wpisać to polecenie:

    aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip
    

    (brak cudzysłowów wokół części lambdaFunc powyżej na wypadek, gdybyś się zastanawiał, tak jak ja)

  6. Teraz możesz kliknąć test w konsoli Lambda.

  7. Sugeruję dodanie krótkiego aliasu dla obu powyższych poleceń. Oto co mam w swoim dla znacznie dłuższego polecenia aktualizacji Lambda:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    
JohnAllen
źródło
10
Może być konieczne wyraźne określenie regionu, na który kierujesz reklamy: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox
2
Chociaż wydaje się, że wymaga to dużo pracy, aby przez to przejść, jest to naprawdę o wiele lepszy sposób budowania tych wyrażeń lambda ... wielkie dzięki!
Mike Perrenoud
9
Musiałem użyć --zip-file fileb://versus --zip-file file://podczas wykonywania tych kroków
McLovin
2
Upewnij się, że spakujesz tylko zawartość katalogu i że robisz to z CLI (użycie polecenia „kompresuj” w wyszukiwarce Maca NIE zadziała ).
Yarin
2
To było bardzo przydatne ... brakowało co najmniej dwóch rzeczy, aby ta praca działała dla mnie ... 1) --zip-file fileb:zamiast filedla mnie. 2) na MacOS wygląda na to, że ma 3 ukośniki, np.fileb:///Users/wio/Documents
Tobi
30

.zipPlik jest wymagane w celu włączenia NPM modułów Lambda. I naprawdę nie powinieneś używać edytora WWW Lambda do niczego - tak jak w przypadku każdego kodu produkcyjnego, powinieneś programować lokalnie, angażować się w git itp.

MÓJ PRZEPŁYW:

1) Moje funkcje Lambda są zwykle narzędziami pomocniczymi dla większego projektu, więc tworzę w nim katalog / aws / lambdas , aby je pomieścić.

2) Każdy katalog lambda zawiera plik index.js zawierający kod funkcji, plik package.json definiujący zależności oraz podkatalog / node_modules . (Plik package.json nie jest używany przez Lambdę, służy tylko do lokalnego uruchomienia npm installpolecenia).

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3) .gitignore wszystkie katalogi node_modules i pliki .zip, aby pliki wygenerowane podczas instalacji npm i skompresowania nie zaśmiecały naszego repozytorium.

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Uruchamiam npm installz katalogu, aby zainstalować moduły i lokalnie opracować / przetestować funkcję.

5) Rozpakuj katalog lambda i wgrywam go przez konsolę.

( WAŻNE: nie używaj narzędzia `` kompresuj '' Maca z Findera do spakowania pliku! Musisz uruchomić zip z CLI z poziomu katalogu głównego - patrz tutaj )

zip -r ../yourfilename.zip * 

UWAGA:

Możesz napotkać problemy, jeśli zainstalujesz moduły węzłów lokalnie na swoim Macu, ponieważ niektóre moduły specyficzne dla platformy mogą się nie powieść po wdrożeniu w środowisku opartym na systemie Linux Lambda. (Zobacz https://stackoverflow.com/a/29994851/165673 )

Rozwiązaniem jest skompilowanie modułów na instancji EC2 uruchomionej z AMI, która odpowiada używanemu środowisku wykonawczemu Lambda Node.js (zobacz tę listę środowisk wykonawczych Lambda i odpowiadających im AMI ).


Zobacz także pakiet wdrożeniowy AWS Lambda w Node.js - AWS Lambda

Yarin
źródło
9

Mam nadzieję, że to pomoże, z frameworkiem Serverless możesz zrobić coś takiego:

  1. Dodaj te rzeczy do pliku serverless.yml:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Następnie stwórz swoją funkcję Lambda, wdróż ją serverless deploy, pakiet zawarty w serverless.yml będzie tam dla Ciebie.

Więcej informacji na temat serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/

Toai
źródło
musisz go najpierw zainstalowaćserverless plugin install --name pluginName
Liad Livnat
1

Moduł npm musi być umieszczony w pakiecie w pakiecie nodejs i załadowany do AWS Lambda Layers jako plik zip, wtedy musisz odwołać się do swojego modułu / js jak poniżej i użyć dostępnych w nim metod. const mymodule = require ('/ opt / nodejs / MyLogger');

Sunil Chauraha
źródło