Как загрузить модули npm в AWS Lambda?
Я создал несколько функций Lambda с помощью веб-редактора. Все идет нормально. Теперь я хотел бы начать расширять их с помощью модулей (таких как Q для promises). Я не могу понять, как получить модули для Lambda, чтобы они могли быть использованы моими функциями.
Я прочитал этот, но, похоже, это связано с настройкой EC2 и выполнением функций Lambda. Существует механизм загрузки ZIP файла при создании функции, но, похоже, она включает в себя функции отправки, разработанные локально. Поскольку я работаю в веб-редакторе, который кажется странным рабочим процессом.
Как я могу просто развернуть некоторые модули для использования в моих функциях лямбда?
Ответы
Ответ 1
Вы не можете загрузить модули NPM, не загружая файл .zip
, но вы можете фактически упростить этот процесс до двух быстрых командных строк.
Вот как:
-
Поместите ваши файлы функций Lambda в отдельный каталог. Это потому, что вы устанавливаете пакеты npm
локально для Lambda и хотите иметь возможность изолировать и протестировать то, что вы будете загружать в Lambda.
-
Установите ваши пакеты NPM локально с помощью npm install packageName
пока вы находитесь в отдельном каталоге Lambda, который вы создали на шаге 1.
-
Убедитесь, что ваша функция работает при локальном запуске: node lambdaFunc.js
(вы можете просто закомментировать две строки export.handler
в вашем коде, чтобы адаптировать код для работы с Node локально).
-
Перейдите в каталог Lambda и сожмите содержимое, убедитесь, что не включаете сам каталог.
zip -r lambdaFunc.zip .
-
Если у вас установлен aws-cli
, который я предлагаю, если вы хотите облегчить свою жизнь, теперь вы можете ввести эту команду:
aws lambda update-function-code --function-name lambdaFunc \
--zip-file fileb://~/path/to/your/lambdaFunc.zip
(нет кавычек вокруг части lambdaFunc выше, если вам интересно, как я)
-
Теперь вы можете нажать тест в консоли Lambda.
-
Я предлагаю добавить короткий псевдоним для обеих вышеперечисленных команд. Вот что у меня есть для более длинной команды обновления Lambda:
alias up="aws lambda update-function-code --function-name lambdaFunc \
--zip-file fileb://~/path/to/your/lambdaFunc.zip"
Ответ 2
Файл .zip
необходим для включения модулей npm в Lambda. И вам действительно не следует использовать веб-редактор Lambda для большей части anything-, как с любым рабочим кодом, вы должны разрабатывать локально, использовать 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) Я устанавливаю модули, разрабатываю и тестирую локально
5) Я заархивировал лямбда-каталог и загрузил его через консоль.
(ВАЖНО: не используйте утилиту сжатия Mac из Finder для архивирования файла! Вы должны запустить zip из CLI из корня directory-, см. Здесь)
zip -r ../yourfilename.zip *
См. Также Пакет развертывания AWS Lambda в Node.js - AWS Lambda.
НОТА:
Вы можете столкнуться с проблемой, когда такой модуль, как PhantomJS, создает специфичные для ОС двоичные файлы, и поэтому пакет узлов, созданный локально на OSX, в Lambda завершается сбоем.
Ответ, который я нашел здесь, состоял в том, чтобы использовать эти сценарии для построения его в контейнере Docker.
Ответ 3
Надеюсь, это поможет, с Serverless Framework вы можете сделать что-то вроде этого:
- Добавьте эти вещи в ваш файл 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/
Ответ 4
Теперь вы можете использовать лямбда-слои для этого. Просто добавьте слой, содержащий пакет, который вам нужен, и он будет отлично работать.
Следуйте этому посту: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e