NPM问题:使用AWS CodeDeploy部署Node.js实例

12

我目前正在尝试通过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 到该服务器时相同。

我到底做错了什么傻事?非常感谢。


这个值得强调一下,因为错误信息很长。最终的错误是: npm:找不到命令 - Ali Parr
1
我猜它是以 ec2-user 运行的,但没有运行您的登录脚本,如 .bash_profile.bashrc,因此它在路径上没有 npm。 - Mark B
1
请在 afterinstall.sh 文件的顶部添加 source /path_to_bash_profile - Chris
3个回答

30

正如mbaird和Chris在评论中准确指出的那样-问题出在我没有设置路径。 因此,npm、node、pm2等全部失败。

通过实验,似乎我需要在Codedeploy部署过程的每个步骤中重新建立我的路径。因此,在我的stop.sh / beforeinstall.sh / afterinstall.sh / start.sh的顶部,我包含了:

source /home/ec2-user/.bash_profile

生活很美好。然后我遇到了其他与pm2不在正确工作目录下启动节点相关的问题,但类似对代码部署脚本进行微调使其正常工作。

回过头来看,这一切都很明显,但我非常感谢大家的帮助。谢谢你们!


1
你能分享一下你提到的调整吗?因为看起来我也在寻找同样的东西。 - Galya
5
这是正确的答案。请确保删除 #!/bin/bash 并替换为源代码行。在那个问题上,我撞了一个小时的墙。 - Noel Baron
2
由于某些原因,这个命令对我没有起作用。我添加了 export NVM_DIR="/home/ec2-user/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" 这段代码,它起作用了。 - Kevindra
1
@NoelBaron,谢谢伙计,你为我节省了未来很多时间,在这个问题上我卡了4个小时。 - nishkaush
感谢@Kevindra,这对我也有用!请注意,这是两行代码:export NVM_DIR="/home/ec2-user/.nvm"[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" - Elias Strehle

0

我遇到了同样的问题,因为我先安装了 nvm,然后使用 nvm install node 安装了 node 。 我没能像 @AliParr 在他的答案中提到的那样重新建立我的路径。所以我创建了一个新的 ec2 实例并没有安装 nvm。而是像下面这样安装了node和npm:

sudo apt update
sudo apt install nodejs npm

现在CodeDeploy对npm命令没有任何问题。


-5

主机代理使用一个相对简化的环境。退出代码为127表示操作系统无法找到某些文件以加载脚本(可能是执行脚本所需的脚本或其他内容)。

最好的方法是确保 root 用户已安装 npm。

由于主机代理在作为服务启动时会源自 /etc/profile,您还可以在那里添加任何需要使 npm 正常工作的内容。


7
不要以 root 用户身份运行 node。 - Noel Baron
@NoelBaron 能否详细说明一下? - beyondtdr
@beyondtdr 这是一个非常古老的线程,但基本上你应该始终配置你的系统以已知用户身份运行节点,并具有特定的权限。在大多数 AWS 服务器资源中,你将拥有类似于 ec2-userubuntu 的东西。你应该在这些用户上运行可访问这些用户的端口。然后使用 ELB 和网络规则将特权端口(如 80/443)导向你的非特权端口(3000)。 - Noel Baron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接