Solution
The solution is to add the file .npmrc
to the application with the content:
# Force npm to run node-gyp also as root, preventing permission denied errors in AWS with npm@5
unsafe-perm=true
(Or configuring npm so in any other way. (Though setting npm_config_unsafe_perm=true
in /opt/elasticbeanstalk/env.vars
did not work for me.)
Explanation
npm install
is run by the root user but the node-gyp
process it triggers for some packages is run by the default user ec2-user
. This user lacks access to the /tmp/deployment/application/node_modules/
directory created by the npm install run and owned by root. (And it likely also lacks access to /tmp/.npm
and /tmp/.config
created by the same.) By enabling unsafe-perm
we force npm to run node-gyp also as root, avoiding the problem.
(Personally I would prefer to run all as ec2-user
rather than root
but I guess that would be more involved :-))
Credits
unreal0 has pointed me to the solution