Я не могу просто развернуть функцию с помощью Serverless-framework 1.20.2
Я хотел следовать этим советам
и просто переустановите мою функцию, поскольку serverless.yml
не был изменен.
Однако он просто зависает на этапе Serverless: Uploading function
. Навсегда, видимо.
Все развертывание (с sls deploy
) работает, хотя и медленно.
Как можно отладить это, поскольку, по-видимому, нет сообщения об ошибке?
ИЗМЕНИТЬ
Когда я использую sls deploy
, мой проект занимает около 4 минут и 15 секунд для развертывания.
Мне кажется довольно длинным, поэтому я решил использовать вместо этого sls deploy function -f myFunction
, который должен быть намного быстрее.
Однако, когда я пытаюсь sls deploy function -f myFunction
, он, кажется, вечно вешает на Serverless: Uploading function: myFunction
.
Я не знаю, как отладить это.
Кажется, что используется 'verbose', с Serverless: Uploading function: myFunction --verbose
не имеет значения, возвращаемые сообщения одинаковы.
Я постараюсь подождать и посмотреть, завершится ли, наконец, развертывание функции...
Ну, я ждал, и это не так: примерно через 8 минут 30 секунд я получаю следующее сообщение об ошибке:
Безсерверная ошибка --------------------------------------- Время установления соединения после 120000 мс Получать поддержку -------------------------------------------- Документы: docs.serverless.com Ошибки: github.com/serverless/serverless/issues Форумы: forum.serverless.com Чат: gitter.im/serverless/serverless Информация о вашей среде ----------------------------- ОС: Linux Node Версия: 7.10.0 Версия без сервера: 1.20.2
Другая странность: при подвешивании она читает:
Без сервера: функция загрузки: myFunction (12.05 MB)...
Но сама функция составляет всего 3,2 кБ и не включает никаких пакетов.
Когда я использую sls deploy
, отображаемый размер тот же:
Безсерверный: загрузка ZIP файла службы на S3 (12.05 MB)...
Что может быть неправильно при развертывании моей функции?
ИЗМЕНИТЬ 2
Как подсказывает @dashmug, в serverless.yml
есть проблема с конфигурацией.
В директории functions
моего безсерверного проекта я хотел бы иметь общие package.json
и node_modules
. Затем каждая функция могла импортировать модули по мере необходимости.
Я попытался следовать официальному руководству.
Мой serverless.yml
выглядит так:
functions:
myFunction:
package:
exclude:
- 'functions/node_modules/**'
- '!functions/node_modules/module1_I_want_to_include/**'
- '!functions/node_modules/module2_I_want_to_include/**'
Теперь я получаю с sls deploy
:
Безсерверный: загрузка .zip файла службы на S3 (31.02 MB)...
и функция работает:)
Однако, с sls deploy function -f myFunction
, я получаю:
Без сервера: функция загрузки: отправка (1.65 МБ)...
Он загружается в разумные сроки, но теперь функция дает следующую ошибку:
Невозможно импортировать функции модуля /myFunction ': Ошибка
Ответы
Ответ 1
Вещи, на которые я смотрел бы:
-
Попробуйте сравнить, что происходит между ними:
$ SLS_DEBUG=true sls deploy --verbose
и
$ SLS_DEBUG=true sls deploy function -f myFunction --verbose
-
Проверьте конфигурацию без сервера (упаковка и т.д.) против вашей структуры проекта. Один красный флаг заключается в том, что функция развертывания имеет такое же значение, как развертывание службы. Это может быть проблемой неправильной конфигурации.
-
Используйте serverless package
, чтобы увидеть, как пакет зашифрованы. Он может предоставить некоторые подсказки.
-
Используете ли вы какие-либо плагины, которые, возможно, изменили способ создания вашего пакета?
-
Сколько node_modules
у вас есть? У вас есть только один для всей службы или по одной для каждой функции?
Ответ 2
Вы можете сделать процесс развертывания более подробным, передав аргумент --verbose
функции развертывания.
Либо sls deploy --verbose
, либо sls deploy -v
выполнит трюк.
Ответ 3
Мне не удалось понять, почему развертывание функции (в отличие от развертывания службы) зависает. Возможно, я неправильно сконфигурировал мой файл serverless.yml
.
Но ничего страшного: я могу обойтись без sls deploy function -myFunction
.
Потому что мои ожидания были неправильными. Я думал, что развертывание функции будет быстрее, чем развертывание службы, так как не перераспределяет каталог node_modules
.
Но в AWS нет частичного развертывания функций: при развертывании функции все необходимые модули node также должны быть развернуты, чтобы функция работала.
Как объяснено в serverless doc:
Framework упаковывает целевую функцию AWS Lambda в zip файл.
Framework извлекает хэш уже загруженного .zip файла функции и сравнивает его с локальным хэш файлом .zip.
Рамка завершается, если оба хэша одинаковы.
Этот zip файл загружается в ваш ведро S3 с тем же именем, что и предыдущая функция, на которую указывает стек CloudFormation.
Я (наивно) надеялся, что только обновленный обработчик будет загружен на S3.
Но по мере того как функция упакована перед развертыванием, ей нужны все ее модули и зависимости.
Так что, как я вижу, функция развертывания сэкономит время (в отличие от развертывания службы) только в том случае, если служба имеет несколько функций, а служебные функции не используют многие общие модули nodejs. И если sls deploy function -f myFunction
не зависает, это:)
Чтобы увеличить скорость разработки, трюк заключается в использовании автономной эмуляции с помощью инструмента, такого как serverless offline
serverless offline предоставляет локальный сервер, а лямбда-функция myFunction
становится доступной локально, вызывая http://localhost:3000/myFunction
в Postman или браузер
В большинстве случаев sls deploy
можно вызвать только один раз, после того как обработчик был тщательно протестирован офлайн.