解析AWS CodeDeploy配置与appspec.yml路径匹配报错问题
问题核心原因
- 你对CodeDeploy的两个核心配置逻辑存在误解:
- hooks脚本的默认查找规则:
appspec.yml中hooks的location字段默认优先从本次部署的临时归档目录(即报错中前缀为/home/ec2-user/xxxxxx-cb84-4ef6-966b-xxxxxxxxx/d-xxxxx/deployment-archive/的目录)下查找文件,你写的绝对路径会被当做相对归档目录的路径做拼接,所以才会出现找不到文件的报错。 codedeployagent.yml中:root_dir的作用:这个配置项定义的是CodeDeploy代理存储临时部署包、缓存文件的根目录,和hooks查找脚本的路径无关,修改它无法解决你的路径问题,官方也不建议自定义该参数,会带来额外的权限、缓存清理隐患。- 如果你修改代理配置后没有重启服务,配置不会生效:修改
/etc/codedeploy-agent/conf/codedeployagent.yml后必须执行sudo service codedeploy-agent restart才能加载新配置。
- hooks脚本的默认查找规则:
推荐解决方案(无需修改实例代理配置)
直接使用部署包内的相对路径指定hooks脚本,这是官方推荐的标准写法,不需要依赖实例的自定义配置,天然适配弹性扩容场景:
- 确认你的CodeCommit部署包根目录下直接存放
update_wheel.sh - 将
appspec.yml的hooks配置修改如下:
version: 0.0 os: linux files: - source: / destination: /home/ec2-user/app/aws file_exists_behavior: OVERWRITE hooks: ApplicationStart: - location: update_wheel.sh timeout: 300 runas: root
- 给
update_wheel.sh添加可执行权限:执行chmod +x update_wheel.sh后再提交到CodeCommit即可。
特殊场景方案:执行已拷贝到目标目录的脚本
如果你确实需要运行/home/ec2-user/app/aws/下的已落地脚本(比如该脚本是之前部署流程生成的),可以按如下配置操作:
- 在部署包根目录新建一个
call_update.sh脚本,内容为:
#!/bin/bash /bin/bash /home/ec2-user/app/aws/update_wheel.sh
- 给
call_update.sh添加可执行权限,然后修改appspec.yml的hooks部分为:
hooks: ApplicationStart: - location: call_update.sh timeout: 300 runas: root
内容的提问来源于stack exchange,提问作者d8aninja
相关产品推荐
相关产品推荐

