Развертывание AWS эластичного бобового стержня завершается ошибкой ENOMEM

Сбой при развертывании AWS Elastic Beanstalk: - прерывистый - без видимой реальной причины

Шаг 1: Проверьте очевидный журнал

/var/log/eb-activity.log

  Running npm install:  /opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm
  Setting npm config jobs to 1
  npm config jobs set to 1
  Running npm with --production flag
  Failed to run npm install. Snapshot logs for more details.
  Traceback (most recent call last):
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 695, in <module>
      main()
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 677, in main
      node_version_manager.run_npm_install(options.app_path)
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 136, in run_npm_install
      self.npm_install(bin_path, self.config_manager.get_container_config('app_staging_dir'))
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 180, in npm_install
      raise e
  subprocess.CalledProcessError: Command '['/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm', '--production', 'install']' returned non-zero exit status 1 (ElasticBeanstalk::ExternalInvocationError)
caused by: + /opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install

Шаг 2: Google для соответствующего файла журнала снимка...

/var/log/nodejs/npm-debug.log

58089 verbose stack Error: spawn ENOMEM
58089 verbose stack     at exports._errnoException (util.js:1022:11)
58089 verbose stack     at ChildProcess.spawn (internal/child_process.js:313:11)
58089 verbose stack     at exports.spawn (child_process.js:380:9)
58089 verbose stack     at spawn (/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/spawn.js:21:13)
58089 verbose stack     at runCmd_ (/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:247:14)
58089 verbose stack     at /opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:211:7
58089 verbose stack     at _combinedTickCallback (internal/process/next_tick.js:67:7)
58089 verbose stack     at process._tickCallback (internal/process/next_tick.js:98:9)
58090 verbose cwd /tmp/deployment/application
58091 error Linux 4.4.44-39.55.amzn1.x86_64
58092 error argv "/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm" "--production" "install"
58093 error node v6.10.0
58094 error npm  v3.10.10
58095 error code ENOMEM
58096 error errno ENOMEM
58097 error syscall spawn
58098 error spawn ENOMEM

Шаг 3: Очевидные варианты...

  • Используйте больший экземпляр, и это работает...

  • Не исправляй, просто попробуй еще раз

    • Разверните снова, и это работает...

    • Клонировать среду, и она работает...

    • Восстановить среду, и она работает....

  • Чувствуете себя грязным и неправильным

2 ответа

Решение

TL;DR

Вашим экземплярам (в моем случае t2.micro) не хватает памяти, поскольку раскрутка экземпляра распараллелена.

Решение проблемы взлома: выделите пространство SWAP для экземпляра и повторите попытку

Для разовых, пока залогинен в экземпляр...

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo chmod 600 /var/swap.1
sudo /sbin/swapon /var/swap.1

Из / более подробно: Как добавить своп в экземпляр EC2?

Во время развертывания мы используем немного SWAP, но без сбоев

Mem:   1019116k total,   840880k used,   178236k free,    15064k buffers
Swap:  1048572k total,    12540k used,  1036032k free,    62440k cached

Актуальные разрешения

Большие случаи

  • Хотя хранилище можно масштабировать с помощью EBS, экземпляры поставляются с фиксированным ЦП и ОЗУ, источником AWS.
  • Стоит денег, и это всего лишь примеры разработки, где mem является проблемой только во время раскрутки

Автоматизировать предоставление свопа в ElasticBeanStalk

  • Наверное .ebextensions/
  • Открытый вопрос: стиль формирования облака или ловушка при развертывании / перезапуске?

Прыгните на безсерверный фургон

  • Обещание API Gateway + Lambda + Friends состоит в том, что нам не нужно иметь дело с этим ишем.
  • Вы "достаточно высокий" для облачных микросервисов? Являются ли они даже подходящими для вашей проблемы, когда будет достаточно чего-то неизменного / немодного, такого как SOA.
  • Однажды перейдя в облачную среду, будет сложно вернуться к предварительной установке, что является требованием для некоторых.

Используйте менее раздутые пакеты

  • Иногда вы застряли с наследием
  • Может быть вызвано необходимыми переходными или подчиненными зависимостями. Где это заканчивается... разложение чужих библиотек?

объяснение

Быстрый Google показывает, что ENOMEM Ошибка нехватки памяти.t2.micro экземпляры имеют только 1 ГБ ОЗУ.

Редко бы мы использовали это количество на dev; однако ElasticBeanstalk распараллеливает части процесса сборки через порожденных рабочих. Это означает, что во время SETUP для больших пакетов может не хватить памяти, и операция завершится неудачно.

С помощью free -m мы можем увидеть...

Пуск (много свободной памяти)

             total       used       free     shared    buffers     cached
Mem:       1019116     609672     409444        144      45448     240064
-/+ buffers/cache:     324160     694956
Swap:            0          0          0

Недостаточно памяти на следующем тике)

Mem:       1019116     947232      71884        144      11544      81280
-/+ buffers/cache:     854408     164708
Swap:            0          0          0

Процесс развертывания прерван

             total       used       free     shared    buffers     cached
Mem:       1019116     411892     607224        144      13000      95460
-/+ buffers/cache:     303432     715684
Swap:            0          0          0

Редко бы мы использовали это количество на dev; однако ElasticBeanstalk распараллеливает части процесса сборки через порожденных рабочих. Это означает, что во время SETUP для больших пакетов может не хватить памяти, и операция завершится неудачно.

Это именно то, что происходило со мной! Мой сервер node.js работал нормально на моем dev2 ec2 t2-micro, но когда я развернул промежуточную среду на эластичном бобовом стебле (также с t2-micro), эта ошибка появилась, изменив экземпляр e b на t2-small, добился цели.

Другие вопросы по тегам