AWS Elastic Beanstalk部署卡顿,重启EC2恢复,求原因与解决方案
AWS Elastic Beanstalk部署Spring Boot卡顿问题排查与修复
问题现象
在AWS Elastic Beanstalk上运行Spring Boot应用时,每次启动部署都会出现卡顿;但终止后端EC2实例并启动新实例后,部署就能顺利完成。相关错误事件如下:
Command failed on instance. Return code: 1 Output: + initctl status eb-ecs + grep -q 'eb-ecs start/' + initctl stop eb-ecs EB_EVENT_FILE=/tmp/eventsfile20221019-657-uyhfrc initctl: Job failed while stopping. Hook /opt/elasticbeanstalk/hooks/appdeploy/enact/00stop-task.sh failed
可能原因
- eb-ecs服务状态异常:部署时的停止脚本尝试停止eb-ecs服务,但服务本身处于僵死、pid文件丢失等异常状态,导致
initctl无法正常执行停止操作,进而卡住部署流程。 - 停止脚本容错性不足:
00stop-task.sh脚本直接执行initctl stop eb-ecs,未处理服务未运行或状态异常的场景,一旦停止命令返回非零值就直接中断部署。 - 应用进程残留:之前的Spring Boot应用进程未被彻底清理,占用了eb-ecs服务绑定的资源,导致服务无法正常停止。
修复方案
1. 增强停止脚本的容错逻辑
修改/opt/elasticbeanstalk/hooks/appdeploy/enact/00stop-task.sh脚本,增加服务状态判断,仅在服务运行时执行停止操作,同时允许停止命令失败不中断部署:
#!/bin/bash # 检查eb-ecs是否处于运行状态 initctl status eb-ecs | grep -q 'eb-ecs start/' if [ $? -eq 0 ]; then # 尝试停止服务,即使失败也不终止脚本 initctl stop eb-ecs || true fi
2. 强制清理残留进程
在停止脚本中添加进程清理步骤,提前清除可能残留的Spring Boot应用或eb-ecs相关僵死进程:
#!/bin/bash # 清理Spring Boot应用进程(替换为你的应用jar包名称) pkill -f "your-spring-boot-app.jar" || true # 清理eb-ecs相关僵死进程 pkill -f "eb-ecs" || true # 后续执行原有的服务停止逻辑 initctl status eb-ecs | grep -q 'eb-ecs start/' if [ $? -eq 0 ]; then initctl stop eb-ecs || true fi
3. 调整Elastic Beanstalk部署配置
- 启用滚动更新策略,设置合理的最小健康实例数,避免单实例部署时因服务停止失败导致整个部署中断;
- 若条件允许,采用蓝绿部署,完全隔离新旧环境,规避服务停止环节的问题;
- 延长部署超时时间,给服务停止、资源释放留足处理时长。
4. 排查服务日志定位根因
查看以下日志文件,定位eb-ecs服务停止失败的具体原因:
/var/log/eb-ecs.log:eb-ecs服务的运行日志/var/log/init.log:initctl命令的执行日志/var/log/elasticbeanstalk/hooks/appdeploy/enact/00stop-task.sh.log:停止脚本的执行日志
根据日志中的具体报错(如资源占用、配置错误等)进行针对性修复。
内容的提问来源于stack exchange,提问作者Chandan Gowda
相关产品推荐
相关产品推荐

