AWS CodeDeploy部署Ruby应用遇权限及脚本执行故障求助
咱们一步步来解决你遇到的这两个CodeDeploy部署问题,先从日志里明确的AfterInstall失败问题入手,再搞定权限配置的难题。
问题1:AfterInstall脚本执行失败(exit code 127)
从错误日志里能揪出两个核心问题:
Host key verification failed—— Git仓库的主机密钥验证不通过bundle: command not found&LoadError: cannot load such file -- bundler/setup—— Ruby环境变量没正确加载
解决Git主机密钥验证问题
CodeDeploy agent是以codedeploy-agent用户身份运行的,和你手动执行脚本用的ubuntu用户完全是两个环境:
codedeploy-agent的~/.ssh目录里没有Git仓库(比如GitHub/GitLab)的主机密钥,导致连接时触发安全验证失败;- 同时该用户大概率没有访问私有Git仓库的SSH密钥权限。
给你两个可行的解决办法:
- 方案一:把Git主机密钥加到系统级known_hosts
在update.sh里的Git拉取命令前,加这么一行:
这样所有用户都会信任这个主机,避开单个用户的SSH环境限制。ssh-keyscan github.com >> /etc/ssh/ssh_known_hosts - 方案二:以ubuntu用户身份执行Git操作
如果你的SSH密钥是配置在ubuntu用户下的,直接在脚本里用sudo -u ubuntu来跑Git命令:
这样会继承ubuntu用户的SSH环境,密钥和主机验证的问题就都解决了。sudo -u ubuntu git pull origin main
解决bundle命令找不到的问题
手动执行时能找到bundle,是因为你的ubuntu用户加载了Ruby版本管理工具(比如rbenv、rvm、chruby)的环境变量,但CodeDeploy agent的运行环境没加载这些配置。
可以这么处理:
- 在脚本开头加载Ruby环境
如果你用的是rbenv,在update.sh最顶部加:source /home/ubuntu/.bashrc # 或者更直接地指定路径: # export PATH="$HOME/.rbenv/bin:$PATH" # eval "$(rbenv init -)" - 直接用bundle的绝对路径
先在服务器上跑which bundle找到绝对路径(比如/home/ubuntu/.rbenv/shims/bundle),然后把脚本里所有bundle替换成这个绝对路径,比如:/home/ubuntu/.rbenv/shims/bundle install
问题2:permissions块无法修改权限
看你的appspec.yml配置,大概率是两个原因之一:
- CodeDeploy agent用户(
codedeploy-agent)没有足够权限修改/var/www/dev/的所有者、组或权限; - 缺少
recursive参数,导致只修改了目录本身,没递归处理下面的子文件和子目录(如果你的需求是递归修改的话)。
解决办法
方案一:更新permissions配置,添加递归参数
如果需要递归修改目录下所有内容的权限,把appspec.yml的permissions块改成这样:
permissions: - object: /var/www/dev/ owner: ubuntu group: ubuntu mode: 777 type: - directory recursive: true # 新增这一行,递归修改子目录和文件
方案二:在BeforeInstall钩子中提前调整权限
如果/var/www/dev/的父目录或自身是root所有,codedeploy-agent没权限修改,可以在部署前先调整权限:
首先在appspec.yml里添加BeforeInstall钩子:
hooks: BeforeInstall: - location: deploy/prepare_permissions.sh timeout: 60 AfterInstall: - location: deploy/update.sh timeout: 240 ApplicationStart: - location: deploy/restart.sh timeout: 120
然后创建deploy/prepare_permissions.sh脚本:
#!/bin/bash sudo chown -R ubuntu:ubuntu /var/www/dev/ sudo chmod -R 777 /var/www/dev/
注意:得给codedeploy-agent用户加sudo权限,在服务器的sudoers文件里添加:
codedeploy-agent ALL=(ALL) NOPASSWD: /bin/chown, /bin/chmod
这样codedeploy-agent就能无密码执行chown和chmod命令了。
内容的提问来源于stack exchange,提问作者sjm
相关产品推荐
相关产品推荐

