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

AWS CodeDeploy部署Ruby应用遇权限及脚本执行故障求助

咱们一步步来解决你遇到的这两个CodeDeploy部署问题,先从日志里明确的AfterInstall失败问题入手,再搞定权限配置的难题。

问题1:AfterInstall脚本执行失败(exit code 127)

从错误日志里能揪出两个核心问题:

  1. Host key verification failed —— Git仓库的主机密钥验证不通过
  2. 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-keyscan github.com >> /etc/ssh/ssh_known_hosts
    
    这样所有用户都会信任这个主机,避开单个用户的SSH环境限制。
  • 方案二:以ubuntu用户身份执行Git操作
    如果你的SSH密钥是配置在ubuntu用户下的,直接在脚本里用sudo -u ubuntu来跑Git命令:
    sudo -u ubuntu git pull origin main
    
    这样会继承ubuntu用户的SSH环境,密钥和主机验证的问题就都解决了。

解决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配置,大概率是两个原因之一:

  1. CodeDeploy agent用户(codedeploy-agent)没有足够权限修改/var/www/dev/的所有者、组或权限;
  2. 缺少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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:18