Как загрузить модули npm в AWS Lambda?

147

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

Я прочитал это, но, кажется, это связано с настройкой EC2 и запуском функций Lambda оттуда. Существует механизм для загрузки zip-файла при создании функции, но, похоже, он включает отправку функций, разработанных локально. Так как я работаю в веб-редакторе, это выглядит как странный рабочий процесс.

Как я могу просто развернуть некоторые модули для использования в моих функциях Lambda?

Фук
источник
7
Все это объясняется в документации здесь - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Ответы:

198

Вы не можете загрузить модули NPM без загрузки .zipфайла, но вы можете фактически упростить этот процесс до двух быстрых командных строк.

Вот как:

  1. Поместите ваши файлы функций Lambda в отдельный каталог. Это потому, что вы устанавливаете 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"
    
JohnAllen
источник
11
Возможно, вам потребуется указать регион, на который вы ориентируетесь: 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
3
Убедитесь, что вы заархивировали только содержимое каталога, и что вы делаете это из CLI (использование команды «compress» из искателя Mac НЕ будет работать ).
Ярин
3
Это было супер полезно ... по крайней мере, две вещи не хватало, чтобы сделать эту работу для меня ... 1) это было --zip-file fileb:вместо fileменя. 2) на MacOS это похоже на 3 слеша, например, какfileb:///Users/wio/Documents
Тоби
31

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

МОЙ ПОТОК:

1) Мои лямбда-функции обычно являются вспомогательными утилитами для более крупного проекта, поэтому я создаю в них каталог / 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) Я заархивировал лямбда-каталог и загрузил его через консоль.

( ВАЖНО: не используйте утилиту сжатия «Mac» из Finder для архивирования файла! Вы должны запустить zip из CLI в корне каталога - см. Здесь )

zip -r ../yourfilename.zip * 

НОТА:

Вы можете столкнуться с проблемами, если вы будете устанавливать модули узлов локально на вашем Mac, поскольку некоторые специфичные для платформы модули могут дать сбой при развертывании в среде Lambda на основе Linux. (См. Https://stackoverflow.com/a/29994851/165673 )

Решение состоит в том, чтобы скомпилировать модули в экземпляре EC2, запущенном из AMI, который соответствует используемой среде выполнения Lambda Node.js (см. Этот список сред выполнения Lambda и их соответствующие AMI ).


См. Также Пакет развертывания AWS Lambda в Node.js - AWS Lambda.

Ярина
источник
9

Надеюсь, это поможет, с Serverless Framework вы можете сделать что-то вроде этого:

  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/

Toai
источник
сначала нужно его установитьserverless plugin install --name pluginName
Liad Livnat
1

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

Сунил Чаураха
источник