Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы не можете загрузить модули 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"
    

Ответ 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 вы можете сделать что-то вроде этого:

  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/