5

J'essaie actuellement d'automatiser le déploiement d'une application nodejs vers une instance EC2 via Github et AWS Codedeploy. J'ai suivi les instructions de here aussi étroitement que possible, mais j'ai rencontré un problème avec mon événement de hook AfterInstall.Problème de NPM déployant une instance nodejs en utilisant AWS codedeploy

Voici mon fichier 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 

J'invoque la Déployez via l'AWS CLI comme ceci:

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 

Tout fonctionne très bien, jusqu'à atteindre la phase AfterInstall et mon « AfterInstall. sh 'est exécuté. Ce fichier ressemble à ceci:

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

et produit le journal d'erreur suivant, provoquant un échec de déploiement:

Code d'erreur: ScriptFailed

Message: Script à l'emplacement spécifié: backend /app/deploy/afterinstall.sh exécuté en tant qu'utilisateur ec2-utilisateur échoué avec le code de sortie 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 

Cependant, si je ssh dans mon instance EC2, accédez soit le répertoire temporaire:

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

ou

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

et soit exécuter manuellement 'installer NPM', ou d'exécuter mon script via. /afterinstall.sh, alors npm fonctionne bien. Pourquoi les choses sont-elles différentes pour l'agent Codedeploy? J'utilise 'runas: ec2-user', donc je suppose que les permissions sont les mêmes que lorsque je suis ssh dans la boîte en tant qu'utilisateur ec2.

Quelle chose idiote est-ce que je fais mal? Beaucoup, merci beaucoup.

+0

Il vaut la peine de mettre en surbrillance car le message d'erreur est long. L'erreur éventuelle est la suivante: npm: commande introuvable –

+0

Je suppose qu'elle s'exécute en tant que 'ec2-user' mais sans exécuter vos scripts de connexion tels que' .bash_profile' et '.bashrc', donc elle n'a pas de npm Sur le chemin. –

+0

Mettez 'source/path_to_bash_profile' par-dessus votre afterinstall.sh – Chris

Répondre

12

Comme noté avec précision dans les commentaires par mbaird et Chris - c'était que je n'avais pas mon ensemble PATH. Donc npm, et le noeud, et pm2 et ... tous ont échoué. Par expérimentation, il est apparu que j'avais besoin de rétablir mon chemin à chaque étape du processus de déploiement de Codedeploy. Donc, au sommet de ma stop.sh/beforeinstall.sh/afterinstall.sh/start.sh, j'inclus:

source /home/ec2-user/.bash_profile 

et la vie était bonne. Je me suis ensuite heurté à d'autres problèmes avec le nœud pm2 ne démarrant pas dans le bon répertoire de travail, mais une modification similaire aux scripts codedeploy a fonctionné. Cela a été évident avec le recul, mais je suis extrêmement reconnaissant pour l'aide. Merci les gars!

+1

Souhaitez-vous partager les réglages que vous mentionnez, car il semble que je cherche la même chose? – Galya

+1

Ceci est la bonne réponse. Assurez-vous de supprimer #!/Bin/bash et remplacez-le par la ligne source. Je me suis cogné la tête contre le mur pendant une heure. –

-2

L'agent hôte utilise des racines assez dépouillées de l'environnement. Un code de sortie de 127 indique que le système d'exploitation ne peut pas trouver le fichier dont il a besoin pour charger le script (il pourrait s'agir du script de quelque chose qui est nécessaire pour l'exécuter).

La meilleure chose à faire est de s'assurer que npm est installé pour root. Depuis, l'agent hôte source/etc/profile lorsqu'il est lancé en tant que service, vous pouvez également ajouter tout ce dont vous avez besoin pour faire fonctionner npm là-bas.

+2

N'exécutez pas le noeud en tant qu'utilisateur root. –