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?
Odpowiedzi:
Nie możesz załadować modułów NPM bez przesłania
.zip
pliku, ale w rzeczywistości możesz sprowadzić ten proces do dwóch szybkich linii poleceń.Oto jak:
Umieść pliki funkcji Lambda w osobnym katalogu. Dzieje się tak, ponieważ
npm
lokalnie instalujesz pakiety dla Lambda i chcesz mieć możliwość wyodrębnienia i przetestowania tego, co załadujesz do Lambda.Zainstaluj pakiety NPM lokalnie
npm install packageName
w oddzielnym katalogu Lambda utworzonym w kroku 1.Upewnij się, że Twoja funkcja działa, gdy działa lokalnie:
node lambdaFunc.js
(możesz po prostuexport.handler
zakomentować dwie linie w kodzie, aby dostosować kod do lokalnego działania z Node).Przejdź do katalogu Lambda i skompresuj zawartość , upewnij się, że nie zawiera samego katalogu.
Jeśli masz
aws-cli
zainstalowany, co sugeruję, jeśli chcesz ułatwić sobie życie, możesz teraz wpisać to polecenie:(brak cudzysłowów wokół części lambdaFunc powyżej na wypadek, gdybyś się zastanawiał, tak jak ja)
Teraz możesz kliknąć test w konsoli Lambda.
Sugeruję dodanie krótkiego aliasu dla obu powyższych poleceń. Oto co mam w swoim dla znacznie dłuższego polecenia aktualizacji Lambda:
źródło
aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
--zip-file fileb://
versus--zip-file file://
podczas wykonywania tych kroków--zip-file fileb:
zamiastfile
dla mnie. 2) na MacOS wygląda na to, że ma 3 ukośniki, np.fileb:///Users/wio/Documents
.zip
Plik 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 install
polecenia).package.json:
3) .gitignore wszystkie katalogi node_modules i pliki .zip, aby pliki wygenerowane podczas instalacji npm i skompresowania nie zaśmiecały naszego repozytorium.
.gitignore:
4) Uruchamiam
npm install
z 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 )
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
źródło
W tym celu możesz teraz używać Lambda Layers. Po prostu dodaj warstwę zawierającą potrzebny pakiet i będzie działać idealnie.
Śledź ten post: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
źródło
Mam nadzieję, że to pomoże, z frameworkiem Serverless możesz zrobić coś takiego:
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/
źródło
serverless plugin install --name pluginName
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');
źródło