Le déploiement d'une application Node.js (Node 6, npm 5) sur Beanstalk échoue avec:
gyp ERR! Erreur de pile: EACCES: autorisation refusée, mkdir '/ tmp/deployment/application/node_modules/heapdump/build'
bien que l'erreur ne soit pas spécifique à un package, tout appel node-gyp échoue.
L'événement ERROR dans la console AWS se lit comme suit:
[Instance: i-12345] La commande a échoué sur l'instance. Code de retour: 1 Sortie: (TRUNCATED) .../opt/elasticbeanstalk/containerfiles/ebnode.py ", ligne 180, dans npm_install, augmentez le sous-processus.CalledProcessError: Commande '['/opt/elasticbeanstalk/node-install/node- v6.10.0-linux-x64/bin/npm ',' --production ',' install ']' a renvoyé un statut de sortie différent de zéro 1. Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh a échoué. Pour plus de détails, consultez /var/log/eb-activity.log à l'aide de la console ou de l'interface de ligne de commande EB.
et eb-activity.log
contenait l'erreur npm susmentionnée.
L'application a été déployée manuellement en téléchargeant un fichier .Zip n'incluant pas node_modules
. C'est à dire. il n'a pas été déployé via l'outil de ligne de commande eb
.
La solution consiste à ajouter le fichier .npmrc
À l'application avec le contenu:
# Force npm to run node-gyp also as root, preventing permission denied errors in AWS with npm@5
unsafe-perm=true
(Ou configurer npm de toute autre manière. (Bien que le réglage de npm_config_unsafe_perm=true
Dans /opt/elasticbeanstalk/env.vars
N'ait pas fonctionné pour moi.)
npm install
Est exécuté par l'utilisateur root mais le processus node-gyp
Qu'il déclenche pour certains packages est exécuté par l'utilisateur par défaut ec2-user
. Cet utilisateur n'a pas accès au répertoire /tmp/deployment/application/node_modules/
Créé par l'installation npm et appartenant à root. (Et il manque aussi probablement l'accès à /tmp/.npm
Et à /tmp/.config
Créés par le même.) En activant unsafe-perm
, Nous forçons npm à exécuter node-gyp également en tant que root, évitant ainsi le problème. .
(Personnellement, je préférerais que tous fonctionnent comme ec2-user
Plutôt que root
mais je suppose que cela serait plus impliqué :-))
nreal0 m'a indiqué la solution
Nous devons faire 2 choses ici.
Premier cas: créez-le si vous n'avez pas déjà de dossier .ebextensions à la racine de votre projet. Créez ensuite un fichier dans .ebextensions nommé 01_fix_permissions.config.
Ensuite, activez PROXY set -xe
et /opt/elasticbeanstalk/bin/healthd-track-pidfile --proxy nginx
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/49_change_permissions.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
Sudo chown -R ec2-user:ec2-user tmp/
set -xe
/opt/elasticbeanstalk/bin/healthd-track-pidfile --proxy nginx
j'ai corrigé avec la configuration d'aws sur l'instance. t2.micro => t2.small ou un plus grand. entrez la description du lien ici