我目前正在尝试通过Github和AWS Codedeploy自动部署nodejs应用程序到EC2实例。我已经尽可能地按照这里的说明进行操作,但我在AfterInstall挂钩事件中遇到了问题。
这是我的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
我通过 AWS CLI 这样调用部署:
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
一切都很顺利,直到我到达AfterInstall阶段并执行我的'afterinstall.sh'文件。 该文件看起来像这样:
#!/bin/bash
cd /home/ec2-user/signal/app/
npm install
下面是错误日志,导致部署失败:
错误码:ScriptFailed
错误信息:在指定位置运行的脚本 backend/app/deploy/afterinstall.sh 以 ec2-user 用户身份运行失败,退出代码为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
但是,如果我通过ssh登录到我的ec2实例,然后进入temp目录:
/opt/codedeploy-agent/deployment-root/be9902d2-8af0-46fd-b186-23ead6bea5a4/d-SBW6YCLKC/deployment-archive/backend/app/deploy/
或者cd /home/ec2-user/signal/app/
要让 npm
正常运行,您需要手动运行 npm install
或通过 ./afterinstall.sh
运行我的脚本。
为什么 Codedeploy 代理不同呢?我正在使用 runas: ec2-user
,因此我认为权限等与我以 ec2-user
的身份 ssh 到该服务器时相同。
我到底做错了什么傻事?非常感谢。
ec2-user
运行的,但没有运行您的登录脚本,如.bash_profile
和.bashrc
,因此它在路径上没有 npm。 - Mark Bsource /path_to_bash_profile
。 - Chris