Як завантажити модулі npm в AWS Lambda?


147

Я створив кілька функцій Lambda за допомогою веб-редактора. Все йде нормально. Зараз я хотів би почати розширювати такі модулі (як Q для обіцянок). Я не можу зрозуміти, як вивести модулі на Lambda, щоб вони могли споживати мої функції.

Я читав це, але, здається, це передбачає налаштування EC2 та запуск функцій Lambda звідти. Існує механізм для завантаження zip при створенні функції, але, схоже, це передбачає надсилання функцій, розроблених локально. Оскільки я працюю в веб-редакторі, це здається дивним робочим процесом.

Як я можу просто розгорнути деякі модулі для використання у своїх функціях Lambda?


7
Все це пояснено в документах тут - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Відповіді:


196

Ви не можете завантажити модулі NPM, не завантажуючи .zipфайл, але ви можете фактично звести цей процес до двох швидких командних рядків.

Ось як:

  1. Помістіть свої файли (файли) лямбда в окремий каталог. Це відбувається тому, що ви npmлокально встановлюєте пакети для Lambda і хочете мати змогу виділити і протестувати те, що ви завантажите в Lambda.

  2. Встановіть свої пакети NPM локально npm install packageName, перебуваючи в окремому каталозі Lambda, який ви створили на кроці №1.

  3. Переконайтеся, що ваша функція працює під час локального запуску: node lambdaFunc.js(ви можете просто прокоментувати два export.handlerрядки у вашому коді, щоб адаптувати код для роботи з Node локально).

  4. Перейдіть до каталогу Lambda і стисніть вміст , переконайтеся, що не включаєте сам каталог.

    zip -r lambdaFunc.zip .
    
  5. Якщо у вас aws-cliвстановлено, що я пропоную вам, якщо ви хочете полегшити своє життя, тепер можете ввести цю команду:

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

    (жодних цитат навколо частини lambdaFunc вище, якщо ви дивитесь, як я)

  6. Тепер ви можете натиснути тест на консолі Lambda.

  7. Я пропоную додати короткий псевдонім для обох вищевказаних команд. Ось що я маю для значно довшої команди оновлення Lambda:

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

10
Можливо, вам потрібно буде чітко вказати регіон, на який ви орієнтуєтесь: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
Хоча здається, що набагато більше роботи, щоб пройти це, це дійсно набагато кращий спосіб побудови цих лямбда-виразів ... велике спасибі!
Майк Перренод

9
Мені довелося користуватися --zip-file fileb://порівняно --zip-file file://під час використання цих кроків
McLovin

2
Переконайтеся, що ви завантажуєте лише вміст каталогів, і що ви робите це з CLI (використовуючи команду "стиснення" у пошуку шукача НЕ буде працювати ).
Ярін

2
Це було дуже корисно .. принаймні дві речі не вистачало, щоб зробити цю роботу для мене ... 1) це було --zip-file fileb:замість fileмене. 2) на MacOS, здається, це 3 fileb:///Users/wio/Documents
Тобі

30

.zipФайл необхідний для того , щоб включити НПЕ модулі Lambda. І ви справді не повинні використовувати веб-редактор Lambda для великої кількості нічого, як і будь-якого виробничого коду, ви повинні розвиватися на місцевому рівні, здійснюючи git тощо.

МОЙ ПОТОК:

1) Мої функції Lambda зазвичай є допоміжними програмами для більшого проекту, тому я створюю каталог / aws / lambdas в межах цього, щоб розмістити їх.

2) Кожен окремий каталог лямбда містить файл index.js, що містить код функції, файл package.json, що визначає залежності, і підкаталог / node_modules . (Файл package.json Lambda не використовується, це просто так, щоб ми могли локально запустити npm installкоманду.)

package.json:

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

3) Я .gitignore всі каталоги node_modules та .zip файли, щоб файли, згенеровані при встановленні npm та блискавці, не захаращували наше репо.

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Я бігаю npm installзсередини каталогу, щоб встановити модулі та розробити / протестувати функцію локально.

5) Я .zip ламбда-каталог і завантажую його через консоль.

( ВАЖЛИВО: Не використовуйте для компіляції файлу утиліту "стиснення" Mac із Finder! Ви повинні запустити zip з CLI з кореня каталогу, дивіться тут )

zip -r ../yourfilename.zip * 

ПРИМІТКА:

Ви можете зіткнутися з проблемами, якщо локально встановити модулі вузлів на вашому Mac, оскільки деякі модулі, орієнтовані на платформу, можуть вийти з ладу при розгортанні в Linux-середовищі Lambda. (Дивіться https://stackoverflow.com/a/29994851/165673 )

Рішення полягає у компіляції модулів на екземплярі EC2, запущеному з AMI, який відповідає виконуваному Lambda Node.js виконанню (Див. Цей перелік виконуваних програм Lambda та їх відповідних AMI ).


Дивіться також пакет AWS Lambda Deployment Package в Node.js - AWS Lambda



9

Сподіваюся, це допомагає, за допомогою безсерверної системи ви можете зробити щось подібне:

  1. Додайте ці речі до файлу serverless.yml:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Потім створіть свою функцію Lambda, розгорніть її serverless deploy, пакет, що входить у serverless.yml, буде для вас.

Для отримання додаткової інформації про безсервер: https://serverless.com/framework/docs/providers/aws/guide/quick-start/


спочатку вам потрібно його встановитиserverless plugin install --name pluginName
Liad Livnat

1

Модуль npm має бути вбудований у ваш пакет nodejs та завантажений у AWS Lambda Layers як zip, тоді вам потрібно буде звернутися до свого модуля / js, як показано нижче, та використовувати доступні методи з нього. const mymodule = requ ('/ opt / nodejs / MyLogger');

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.