Я не могу просто развернуть функцию с помощью 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 можно вызвать только один раз, после того как обработчик был тщательно протестирован офлайн.