NPM问题使用AWS codedeploy部署nodejs实例

时间:2015-12-02 00:18:52

标签: node.js amazon-web-services amazon-ec2 npm aws-code-deploy

我目前正在尝试通过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

并生成以下错误日志,导致部署失败:

错误代码: 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

但是,如果我进入我的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框中输入时的权限相同。

我做错了什么愚蠢的事? 很多,非常感谢。

3 个答案:

答案 0 :(得分:15)

正如mbaird和Chris的评论中所指出的那样 - 我没有设置PATH。所以npm,node,pm2和...都失败了。

通过实验,我似乎需要在Codedeploy部署过程的每一步中重新建立自己的路径。所以在我的stop.sh/beforeinstall.sh/afterinstall.sh/start.sh的顶部,我包括:

source /home/ec2-user/.bash_profile

生活很美好。 然后我遇到了其他问题,pm2没有在正确的工作目录中启动节点,但是对codedeploy脚本的类似调整使其工作。

后见之明这一切都很明显,但我非常感谢你的帮助。谢谢你们!

答案 1 :(得分:0)

我遇到了同样的问题,因为我先安装了 nvm,然后使用 nvm install node 安装了 node。 正如@AliParr 在他的回答中提到的那样,我无法重新建立我的道路。所以我新建了一个ec2实例,并没有安装nvm。相反,我像这样安装了 node 和 npm:

sudo apt update
sudo apt install nodejs npm

现在 codedeploy 使用 npm 命令没有问题。

答案 2 :(得分:-3)

主机代理使用根相当简单的环境。退出代码127表示操作系统找不到加载脚本所需的文件(它可能是执行它所需的脚本)。

最好的办法是确保为root安装了npm。

因为,当作为服务启动时,主机代理会提供/ etc / profile,您还可以添加所需的任何内容以使npm在那里工作。

相关问题