AWS CodeDeploy部署Validate Service阶段validate_service.sh退出码1排查
AWS CodeDeploy ValidateService阶段脚本退出码1修复方案
scripts/validate_service.sh返回退出码1的直接原因是脚本中grep Welcome命令未匹配到对应内容——grep未找到匹配行时默认退出码就是1,CodeDeploy对生命周期钩子脚本的判定规则是任何非0退出码都直接标记该阶段失败,进而触发整体部署中断、回滚。
按以下步骤排查修复即可:
1. 修正校验脚本的逻辑缺陷
你当前写的脚本没有做重试容错、没有处理服务启动延迟、没有输出有效错误日志,很容易出现服务还没完全启动就执行校验导致的误判,替换为以下版本:
#!/bin/bash set -euo pipefail # 服务校验配置:最多重试10次,每次间隔3秒,适配服务启动耗时 MAX_RETRY=10 SLEEP_SEC=3 CHECK_ADDR="localhost:80" for ((count=1; count<=MAX_RETRY; count++)); do echo "=== 第${count}次校验服务状态 ===" # 单独获取HTTP状态码,不把grep结果作为唯一判断依据 http_code=$(curl -s -o /tmp/svc_check_resp -w "%{http_code}" --connect-timeout 2 "http://${CHECK_ADDR}" || echo "000") if [ "$http_code" -eq 200 ]; then # 校验页面是否包含预期的Welcome字段 if grep -q "Welcome" /tmp/svc_check_resp; then echo "服务校验通过" exit 0 fi echo "服务返回200,但页面未匹配到Welcome字段,当前页面内容:" cat /tmp/svc_check_resp else echo "服务访问异常,HTTP状态码:${http_code}" fi sleep $SLEEP_SEC done echo "重试耗尽,服务校验未通过" exit 1
脚本提交前记得加可执行权限:chmod +x scripts/validate_service.sh
2. 检查CodeDeploy配置与实例环境
- 确认
appspec.yml中ValidateService钩子配置正确:脚本路径和仓库内实际路径一致,超时时间留足(建议至少设为60秒),执行用户有足够权限,参考配置:
hooks: ValidateService: - location: scripts/validate_service.sh timeout: 60 runas: root
- 确认80端口的服务正常启动:登录实例手动执行
ss -tulpn | grep :80确认端口处于监听状态,如果是StartService阶段启动的服务,先排查该阶段脚本是否执行成功,有没有端口冲突、配置文件错误、权限不足导致服务启动失败的问题。 - 确认实例本地防火墙、安全组规则没有拦截localhost的80端口访问,curl、grep等基础命令在执行用户的PATH路径下可正常调用。
3. 调整部署组阈值避免整体部署被误判中断
如果是多实例部署,先临时调整部署组的健康实例阈值、单实例失败容忍阈值,避免单台实例校验失败就直接判定整个部署失败,等脚本逻辑调通、服务启动正常后再恢复原有阈值配置。
内容的提问来源于stack exchange,提问作者Branko Mandil
相关产品推荐
相关产品推荐

