Как развернуть монорепо-код в AWS Lambda с помощью lerna? - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать две лямбда-функции AWS (написано машинописно).Обе эти функции используют один и тот же код для взаимодействия с API.Чтобы не приходилось копировать один и тот же код в две разные Lambd, я хотел бы переместить свой общий код в локальный модуль, и обе мои Lambdas зависят от указанного модуля.

Моя первоначальная попытка запуска кодамежду двумя лямбдами должен был быть монорепо и лерна.Моя текущая структура проекта выглядит следующим образом:

- lerna.json
- package.json
- packages
  - api
    - package.json
  - lambdas
    - funcA
      - package.json
    - func B
      - package.json

lerna.json:

{
  "packages": [
    "packages/api",
    "packages/lambdas/*"
  ],
  "version": "1.0.0"
}

В каждом из моих package.json для моих функций Lambda я могу включить свой локальный APIмодуль как таковой:

"dependencies": {
    "@local/api": "*"
}

Благодаря этому я смог переместить общий код в его собственный модуль.Однако теперь я не уверен, как связать мои функции для развертывания в AWS Lambda.Есть ли у lerna возможность создать пакет, который можно развернуть?

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Поскольку cp -rL не работает на Mac, мне пришлось придумать нечто подобное.

Вот рабочий процесс, который работает, если все ваши пакеты принадлежат одной области (@org):

В package.json вашего репозитория lerna:

"scripts": {
    "deploy": "lerna exec \"rm -rf node_modules\" && lerna bootstrap -- --production && lerna run deploy && lerna bootstrap"
}

В пакете, который содержит вашу лямбда-функцию:

"scripts":{
    "deploy": "npm pack && tar zxvf packagename-version.tgz && rm -rf node_modules/@org && cp -r node_modules/* package/node_modules && cd package && npm dedupe"
}

Теперь замените «packagename-version» и «@org» соответствующими значениями вашего проекта.Также добавьте все зависимые пакеты в «bundledDependencies».

После запуска npm run deploy в корне вашего репозитория lerna mono вы получите папку «package» в пакете, содержащем вашу лямбда-функцию.Он имеет все зависимости, необходимые для запуска вашей функции.Возьмите это оттуда.

Я надеялся, что использование npm pack позволит мне использовать файлы .npmignore, но кажется, что это не работает.Если у кого-то есть идея, как заставить это работать, дайте мне знать.

0 голосов
/ 11 декабря 2018

Запуск lerna bootstrap создаст папку node_modules в каждом «пакете».Это будет включать все ваши управляемые зависимости lerna, а также внешние зависимости для этого конкретного пакета.

С тех пор ваше развертывание каждой лямбды будет зависеть от того факта, что вы используете lerna.Пакет развертывания должен включать код для этой конкретной лямбды и папку node_modules для этой лямбды - вы можете сжать их и загрузить вручную или использовать что-то вроде SAM или CloudFormation.

Редактировать: как вы правильно указалив итоге вы получите символические ссылки в папке node_modules, которые усложняют процесс упаковки.Чтобы обойти это, вы можете запустить что-то вроде этого перед упаковкой для развертывания:

cp -rL lambdas/funcA/node_modules lambdas/funcA/packaged/node_modules

-L заставит скопированные каталоги скопировать в папку, которую затем можно сжать.

...