AWS CodeDeploy部署EC2时npm install权限错误的修复求助
解决AWS CodeDeploy执行npm install的权限问题
先看你的错误日志,核心问题是npm居然在尝试创建/opt/codedeploy-agent/node_modules目录——这说明执行npm install时的工作目录根本不是你的项目根目录/home/ec2-user/webocitySalonPOS/,加上部署后的文件/目录权限混乱,才导致了两种用户执行都报错的情况。下面一步步解决:
1. 修复autoinstall.sh的工作目录问题
不管用ec2-user还是root执行,先确保脚本在项目根目录下运行。修改你的autoinstall.sh,开头加上切换目录的命令:
#!/bin/bash # 切换到项目根目录,切换失败则直接退出 cd /home/ec2-user/webocitySalonPOS/ || exit 1 # 执行npm install npm install
这一步是关键,之前的错误就是因为CodeDeploy默认在agent的工作目录执行脚本,npm会把依赖装到当前目录(也就是agent的目录),自然没有权限。
2. 修正appspec.yml的权限配置
看你部署后的目录权限,很多文件的所有者是root,但你在appspec里指定了owner: ec2-user,这说明你的permissions配置有问题:
- 原配置中
permissions的第一个object只处理了目录,没覆盖目录下的文件; - ACL写法冗余,且可能干扰了默认权限继承。
修改appspec.yml的files和permissions部分:
version: 0.0 os: linux files: - source: / destination: /home/ec2-user/webocitySalonPOS/ owner: ec2-user group: ec2-user # 新增group配置,确保文件归属正确 permissions: - object: /home/ec2-user/webocitySalonPOS/ mode: 755 owner: ec2-user group: ec2-user type: # 同时处理目录和文件 - directory - file - object: /home/ec2-user/webocitySalonPOS/scripts/ mode: 755 owner: ec2-user group: ec2-user type: - directory - file hooks: AfterInstall: - location: scripts/autoinstall.sh timeout: 1000 runas: ec2-user ApplicationStart: - location: scripts/autostart.sh timeout: 300 runas: ec2-user
这样部署后,所有文件和目录都会归属于ec2-user,避免后续操作的权限冲突。
3. 清理ec2-user的npm权限残留
如果之前用root跑过npm,可能会留下权限异常的缓存或目录,手动清理一下:
# 切换到ec2-user用户 sudo su - ec2-user # 清理npm缓存 npm cache clean --force # 确保npm的用户目录权限正确 sudo chown -R ec2-user:ec2-user /home/ec2-user/.npm/
4. 验证步骤
- 先手动在EC2上执行
/home/ec2-user/webocitySalonPOS/scripts/autoinstall.sh,确认npm install能正常完成; - 重新打包部署,观察CodeDeploy的部署日志是否无报错。
另外补充:为什么用root执行也报错?就算用root,工作目录不对的话,npm还是会往agent目录装依赖,而且root安装的依赖后续用ec2-user启动应用时,依然会有权限问题,所以用ec2-user执行才是更合理的选择。
内容的提问来源于stack exchange,提问作者systemdebt
相关产品推荐
相关产品推荐

