Error: EACCES: permiso denegado al ejecutar `npm install` en Elastic Beanstalk

He provisto una aplicación limpia de node.js a través de Elastic Beanstalk, y tengo un script de node.js que intenta ejecutar la npm install dentro del directorio del proyecto ( /var/app/current/deploy-dist ), sin embargo, el siguiente error de permiso es aventado:

 npm WARN locking Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' npm WARN locking at Error (native) npm WARN locking /tmp/.npm/_locks/staging-f212e8d64a01707f.lock failed { Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' npm WARN locking at Error (native) npm WARN locking errno: -13, npm WARN locking code: 'EACCES', npm WARN locking syscall: 'open', npm WARN locking path: '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' } npm WARN deploy-dist No description npm WARN deploy-dist No repository field. npm WARN deploy-dist No license field. npm ERR! Linux 4.4.35-33.55.amzn1.x86_64 npm ERR! argv "/opt/elasticbeanstalk/node-install/node-v6.9.1-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v6.9.1-linux-x64/bin/npm" "install" npm ERR! node v6.9.1 npm ERR! npm v3.10.8 npm ERR! path /tmp/.npm/_locks/staging-f212e8d64a01707f.lock npm ERR! code EACCES npm ERR! errno -13 npm ERR! syscall open npm ERR! Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' npm ERR! at Error (native) npm ERR! { Error: EACCES: permission denied, open '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' npm ERR! at Error (native) npm ERR! errno: -13, npm ERR! code: 'EACCES', npm ERR! syscall: 'open', npm ERR! path: '/tmp/.npm/_locks/staging-f212e8d64a01707f.lock' } npm ERR! npm ERR! Please try running this command again as root/Administrator. npm ERR! Please include the following file with any support request: npm ERR! /var/app/current/deploy-dist/npm-debug.log 

El package.json es solo un:

 { "dependencies": { "node-fetch": "^1.3.3" } } 

La ejecución de npm install con sudo obviamente funciona, pero se prefiere evitar como solución.

La configuración de NPM_CONFIG_PREFIX en un directorio en ~ según la sugerencia de documentos de npm tampoco funcionó, y el problema persiste.

Sospecho que el problema radica en los permisos incorrectos para /tmp/.npm , que son

 drwxr-xr-x 114 root root 4.0K Dec 27 17:04 .npm 

Esto es confuso, ya que esperaba que una simple npm install funcionara fuera de la caja.

ACTUALIZACIÓN: No debe que el directorio del proyecto ya contenga una carpeta node_modules , pero incluso eliminarlo y ejecutar npm install no lo soluciona.

Tuve este problema! Puede usar ebextensions para crear una secuencia de comandos posterior a la implementación que cambie los permisos de la carpeta tmp/npm/.locks .

En su proyecto node.js, cree una carpeta .ebextensions si aún no tiene una. Luego, agregue un nuevo archivo de configuración, por ejemplo, 00_create_postdeploy_script.config , con el siguiente yaml:

 files: "/opt/elasticbeanstalk/hooks/appdeploy/post/99_fix_node_permissions.sh": mode: "000755" owner: root group: root content: | #!/usr/bin/env bash chown -R nodejs:nodejs /tmp/.npm/_locks/ 

Cuando implementes, esto creará un script en /opt/elasticbeanstalk/hooks/appdeploy/post llamado 99_fix_node_permissions.sh , que tiene este aspecto:

 #!/usr/bin/env bash chown -R nodejs:nodejs /tmp/.npm/_locks/ 

Debido a que se encuentra en esa carpeta de post , se ejecutará automáticamente después de que su aplicación se haya implementado y, por lo tanto, cambiará los permisos según sea necesario.

EDITAR: Si tiene problemas con los permisos de toda la carpeta .npm , debe cambiar la última línea del archivo de configuración a:

 chown -R nodejs:nodejs /tmp/.npm/ 

He tenido este problema en el pasado y, en mi caso, la limpieza del caché solucionó mi problema. Por favor prueba esto

 npm cache clean 

Espero eso ayude.