You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CodeDeploy AfterInstall钩子提示yarn命令不存在

问题根因

报错核心原因是CodeDeploy各生命周期钩子的Shell环境相互独立,nvm相关环境变量没有在后续脚本中加载:

  • CodeDeploy执行每个部署钩子(BeforeInstall、AfterInstall、ApplicationStart)时,都会启动一个全新的独立非交互式Shell进程。你在before_install.sh里执行的export NVM_DIR、加载nvm脚本的操作,仅对当前BeforeInstall阶段的Shell进程有效,进程结束后临时设置的环境变量会直接销毁,不会自动传递给后续启动的AfterInstall阶段的新Shell。
  • nvm安装的Node、以及通过npm全局安装的yarn、pm2等命令,都存放在nvm的版本管理目录下(默认路径为~/.nvm/versions/node/<对应Node版本号>/bin/),这个路径没有加入系统全局PATH,后续新启动的Shell如果不主动加载nvm初始化脚本,就找不到这些命令的位置,触发command not found报错。
  • BeforeInstall阶段能正常执行yarn global add pm2,是因为你在同一个脚本内先完成了nvm加载,当前进程的PATH已经包含了nvm下的Node命令路径,和日志里显示的pm2安装成功的结果完全匹配。
修复方案

最稳妥的修复方式是在所有需要调用node/yarn/pm2命令的部署脚本开头,统一添加nvm初始化逻辑,保证每个独立Shell进程都能正确加载命令路径,具体操作如下:

  • 修改after_install.sh,在脚本头部补充nvm加载代码:
#!/bin/bash
# 初始化nvm环境
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

cd /home/ubuntu/my-app
yarn install
yarn run build
  • 后续用于启动服务的application_start.sh,也需要在开头加上完全相同的nvm初始化代码,否则会触发pm2命令找不到的同类报错。
  • 不推荐通过给yarn/pm2创建全局软链接的方式解决问题,后续nvm切换Node版本时软链接会直接失效,维护成本很高。

注意:不要依赖.bashrc里的自动加载配置,CodeDeploy以指定用户执行非交互式脚本时,默认不会加载用户目录下.bashrc中的配置内容,直接在脚本内加载nvm是兼容性最高的方案。

内容的提问来源于stack exchange,提问作者Susitha Ravinda Senarath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:24:29