When trying to run a script on AfterInstall event I receive:
LifecycleEvent - AfterInstall
Script - deploy/install_dependencies.sh
[stdout]Install dependencies. /
[stderr]/usr/bin/env: node: No such file or directory
, which is strange because:
which node yields: ~/.nvm/versions/node/v15.2.0/bin/nodewhich npm yields: ~/.nvm/versions/node/v15.2.0/bin/npmThe appspec.yml wasn't setup by me, but I think it's straightforward:
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/deploy/
permissions:
- object: /
pattern: "**"
owner: ec2-user
hooks:
AfterInstall:
- location: deploy/install_dependencies.sh
- location: deploy/build.sh
- location: deploy/install_prd_dependencies.sh
- location: deploy/copy_overwrite.sh
# - location: deploy/migrations.sh
timeout: 300
runas: ec2-user
ApplicationStart:
- location: deploy/start_server.sh
timeout: 300
runas: ec2-user
I added runas: ec2-user and the permissions key with its values after reading this: Start Node Application in AfterInstall Hook
, though not the same issue, it seemed that would solve my problem, but it didn't.
I checked if nvm was installed issuing which nvm, it didn't work:
[ec2-user@my-ip ~]$ which nvm
/usr/bin/which: no nvm in (/home/ec2-user/.nvm/versions/node/v15.2.0/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin)
but, issuing only nvm I recevie nvm's CLI help commands without any problem.
I checked the .bashrc of ec2-user to see if nvm was being exported correctly (as suggested in this answer):
# User specific aliases and functions
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
All scripts are using absolute path for npm/node binaries, examples:
install_dependencies.sh
#!/bin/bash
echo "Install dependencies. $(pwd)"
cd /home/ec2-user/deploy/
/home/ec2-user/.nvm/versions/node/v15.2.0/bin/npm install
start_server.sh
#!/bin/bash
echo "Restarting servers..."
/home/ec2-user/.nvm/versions/node/v15.2.0/bin/pm2 restart 0
Is codedpeloy using root user to issue these commands, even with runas setup for ec2-user? I don't understand what's happening, it worked before.
This boils down to the path to node not available at the time of execution. If node is installed via nvm, try adding proper path.
Another way to do it is to add source ~/.nvm/nvm.sh to your bash profile (or an appropriate file, depending on your environment). See Node Version Manager install - nvm command not found
TO Expand on Devin's answer, I added
source ~/.nvm/nvm.sh
to the beginning of my after_install.sh file and it did the trick.
This added the correct path to PM2 & NVM to the deployment user's path. You can confirm this by calling the following before and after the source command:
echo "$PATH"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With