Проблема NPM при развертывании экземпляра nodejs с помощью AWS codedeploy

В настоящее время я пытаюсь автоматизировать развертывание приложения nodejs в экземпляре EC2 через Github и AWS Codedeploy. Я как можно точнее следовал инструкциям здесь, но я наткнулся на загвоздку с моим событием перехвата AfterInstall.

Вот мой yml-файл:

version: 0.0
os: linux
files:
  - source: /backend
    destination: /home/ec2-user/signal
permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user
hooks:
  ApplicationStop:
    - location: backend/app/deploy/stop.sh
      timeout: 10
      runas: ec2-user
  BeforeInstall:
    - location: backend/app/deploy/beforeinstall.sh
      timeout: 1200
      runas: ec2-user
  AfterInstall:
    - location: backend/app/deploy/afterinstall.sh
      timeout: 1200
      runas: ec2-user
  ApplicationStart:
    - location: backend/app/deploy/start.sh
      timeout: 60
      runas: ec2-user
ValidateService:
    - location: backend/app/deploy/validate.sh
      timeout: 60
      runas: ec2-user

Я вызываю развертывание через интерфейс командной строки AWS следующим образом:

aws deploy create-deployment --application-name Signal --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name Production --description "Deployment" --github-location repository=githubusername/repository,commitId=ABCD123 --ignore-application-stop-failures

Все работает нормально, пока я не дойду до фазы AfterInstall и мой «afterinstall.sh» не будет выполнен. Этот файл выглядит так:

#!/bin/bash
cd /home/ec2-user/signal/app/
npm install

И создает следующий журнал ошибок, вызывающий неудачное развертывание:

Код ошибки: ScriptFailed

Сообщение: сценарий в указанном месте: backend / app / deploy / afterinstall.sh, запускаемый от имени пользователя ec2, завершился неудачно с кодом выхода 127

LifecycleEvent - AfterInstall
Script - backend/app/deploy/afterinstall.sh
[stderr]/opt/codedeploy-agent/deployment-root/be9902d2-8af0-46fd-b186-23ead6bea5a4/d-SBW6YCLKC/deployment-archive/backend/app/deploy/afterinstall.sh: line 7: npm: command not found

Однако, если я подключусь к своему экземпляру ec2 по ssh, перейдите в любой каталог temp:

/opt/codedeploy-agent/deployment-root/be9902d2-8af0-46fd-b186-23ead6bea5a4/d-SBW6YCLKC/deployment-archive/backend/app/deploy/

or

cd /home/ec2-user/signal/app/

и либо вручную запустить npm install, либо запустить мой сценарий через ./afterinstall.sh, тогда npm будет работать нормально.

Почему для агента Codedeploy все по-другому? Я использую runas: ec2-user, поэтому я предполагаю, что разрешения и т. Д. Такие же, как когда я вставляю ssh в поле как ec2-user.

Что за идиотизм я делаю не так? Огромное спасибо.


person Ali Parr    schedule 02.12.2015    source источник
comment
Это стоит просто выделить, потому что сообщение об ошибке длинное. Возможная ошибка: npm: команда не найдена   -  person Ali Parr    schedule 02.12.2015
comment
Я предполагаю, что он работает как ec2-user, но не запускает ваши сценарии входа в систему, такие как .bash_profile и .bashrc, поэтому у него нет npm на пути.   -  person Mark B    schedule 02.12.2015
comment
поместите source /path_to_bash_profile поверх afterinstall.sh   -  person Chris    schedule 02.12.2015


Ответы (3)


Как точно было отмечено в комментариях mbaird и Chris, дело в том, что у меня не было установленного PATH. Итак, npm, node, pm2 и ... все не удалось.

Путем экспериментов выяснилось, что мне нужно восстанавливать свой путь на каждом этапе процесса развертывания Codedeploy. Итак, в верхней части моего файла stop.sh/beforeinstall.sh/afterinstall.sh/start.sh я включил:

source /home/ec2-user/.bash_profile

и жизнь была хорошей. Затем я столкнулся с другими проблемами, когда pm2 не запускал узел в правильном рабочем каталоге, но аналогичная настройка сценариев codedeploy заставила это работать.

Оглядываясь назад, все это было очевидно, но я чрезвычайно благодарен за помощь. Спасибо вам, ребята!

person Ali Parr    schedule 03.12.2015
comment
Не могли бы вы поделиться упомянутыми настройками, потому что, похоже, я ищу то же самое? - person Galya; 26.02.2016
comment
Это правильный ответ. Обязательно удалите #! / Bin / bash и замените его исходной строкой. Я бился головой об стену об этом в течение часа. - person Noel Baron; 09.08.2016
comment
У меня почему-то не сработала эта команда. Я добавил export NVM_DIR="/home/ec2-user/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh", который работал - person Kevindra; 01.10.2018
comment
@NoelBaron, спасибо, дружище, ты сэкономил мне много времени на будущее, застрял на этом последние 4 часа. - person nishkaush; 28.05.2020

У меня была такая же проблема, потому что я сначала установил nvm, а затем установил узел с помощью nvm install node. Я не смог восстановить свой путь, как упомянул @AliParr в своем ответе. Поэтому я создал новый экземпляр ec2 и не устанавливал nvm. Вместо этого я установил node и npm вот так:

sudo apt update
sudo apt install nodejs npm

Теперь у codedeploy не было проблем с командой npm.

person Farhan Ali    schedule 25.06.2021

Хост-агент использует довольно урезанную корневую среду. Код выхода 127 указывает на то, что ОС не может найти файл, необходимый для загрузки сценария (это может быть сценарий чего-то, что необходимо для его выполнения).

Лучше всего убедиться, что npm установлен для root.

Поскольку агент хоста при запуске в качестве службы получает / etc / profile, вы также можете добавить все, что вам нужно, чтобы npm работал там.

person Jonathan Turpie    schedule 02.12.2015
comment
Не запускайте узел как root. - person Noel Baron; 09.08.2016
comment
@NoelBaron Хотите уточнить? - person beyondtdr; 15.03.2021
comment
@beyondtdr Это очень старый поток, но по сути вы всегда должны настраивать свои системы для запуска узла как известного пользователя с определенными привилегиями. В большинстве ресурсов сервера AWS у вас будет что-то вроде ec2-user или ubuntu. Вы должны работать от имени этих пользователей на портах, доступных для этих пользователей. Затем используйте правила ELB и сети для передачи привилегированных портов, таких как 80/443, на ваш непривилегированный порт (3000). - person Noel Baron; 15.03.2021