使用 AWS codedeploy 部署 nodejs 实例的 NPM 问题
NPM issue deploying a nodejs instance using AWS codedeploy
我目前正在尝试通过 Github 和 AWS Codedeploy 将 nodejs 应用程序自动部署到 EC2 实例。我已尽可能按照 here 的说明进行操作,但我在 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
并生成以下错误日志,导致部署失败:
错误代码:脚本失败
消息: 指定位置的脚本: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 实例,请导航到临时目录:
/opt/codedeploy-agent/deployment-root/be9902d2-8af0-46fd-b186-23ead6bea5a4/d-SBW6YCLKC/deployment-archive/backend/app/deploy/
或
cd /home/ec2-user/signal/app/
并手动 运行 npm install
,或通过 ./afterinstall.sh
运行 我的脚本,然后 npm
运行 没问题。
为什么 Codedeploy 代理的情况有所不同?我正在使用 runas: ec2-user
,所以我假设权限等与我作为 ec2-user
.
进入框时相同
我做错了什么蠢事?
非常非常感谢。
主机代理使用根相当精简的环境。退出代码 127 表示 OS 找不到加载脚本所需的某些文件(它可能是执行它所需的脚本)。
最好的办法是确保为 root 安装了 npm。
因为主机代理来源 /etc/profile 当作为服务启动时,您还可以添加让 npm 在那里工作所需的任何内容。
正如 mbaird 和 Chris 在评论中准确指出的那样——我没有设置 PATH。所以 npm、node、pm2 和...都失败了。
通过实验,我似乎需要在 Codedeploy 部署过程的每一步中重新建立我的路径。所以在我停止的顶部。sh/beforeinstall.sh/afterinstall.sh/start.sh,我包括:
source /home/ec2-user/.bash_profile
而且生活很美好。
然后我 运行 解决了 pm2 的其他问题,没有在正确的工作目录中启动节点,但是对 codedeploy 脚本的类似调整使它起作用了。
事后看来这一切都很明显,但我非常感谢您的帮助。谢谢大家!
我遇到了同样的问题,因为我先安装了 nvm,然后使用 nvm install node
安装了 node。
正如@AliParr 在他的回答中提到的那样,我无法重新建立我的路径。所以我新建了一个ec2实例,没有安装nvm。相反,我像这样安装了节点和 npm:
sudo apt update
sudo apt install nodejs npm
现在 codedeploy 使用 npm 命令没有问题。
我目前正在尝试通过 Github 和 AWS Codedeploy 将 nodejs 应用程序自动部署到 EC2 实例。我已尽可能按照 here 的说明进行操作,但我在 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
并生成以下错误日志,导致部署失败:
错误代码:脚本失败
消息: 指定位置的脚本: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 实例,请导航到临时目录:
/opt/codedeploy-agent/deployment-root/be9902d2-8af0-46fd-b186-23ead6bea5a4/d-SBW6YCLKC/deployment-archive/backend/app/deploy/
或
cd /home/ec2-user/signal/app/
并手动 运行 npm install
,或通过 ./afterinstall.sh
运行 我的脚本,然后 npm
运行 没问题。
为什么 Codedeploy 代理的情况有所不同?我正在使用 runas: ec2-user
,所以我假设权限等与我作为 ec2-user
.
我做错了什么蠢事? 非常非常感谢。
主机代理使用根相当精简的环境。退出代码 127 表示 OS 找不到加载脚本所需的某些文件(它可能是执行它所需的脚本)。
最好的办法是确保为 root 安装了 npm。
因为主机代理来源 /etc/profile 当作为服务启动时,您还可以添加让 npm 在那里工作所需的任何内容。
正如 mbaird 和 Chris 在评论中准确指出的那样——我没有设置 PATH。所以 npm、node、pm2 和...都失败了。
通过实验,我似乎需要在 Codedeploy 部署过程的每一步中重新建立我的路径。所以在我停止的顶部。sh/beforeinstall.sh/afterinstall.sh/start.sh,我包括:
source /home/ec2-user/.bash_profile
而且生活很美好。 然后我 运行 解决了 pm2 的其他问题,没有在正确的工作目录中启动节点,但是对 codedeploy 脚本的类似调整使它起作用了。
事后看来这一切都很明显,但我非常感谢您的帮助。谢谢大家!
我遇到了同样的问题,因为我先安装了 nvm,然后使用 nvm install node
安装了 node。
正如@AliParr 在他的回答中提到的那样,我无法重新建立我的路径。所以我新建了一个ec2实例,没有安装nvm。相反,我像这样安装了节点和 npm:
sudo apt update
sudo apt install nodejs npm
现在 codedeploy 使用 npm 命令没有问题。