CodePipeline部署Elastic Beanstalk成功但应用健康状态Severe排查
问题根因与修复方案
首要根因
你手动上传的是单独的.war包文件,Elastic Beanstalk会直接识别并部署该war包。但CodePipeline的构建产物默认是zip压缩包,你当前的buildspec配置会生成一个包含myapp.war的zip包,EB部署时只会解压这个zip包,不会额外处理压缩包内的war文件,导致应用没有被实际部署,这是健康状态为Severe的核心原因。
修复配置
根据你使用的EB平台类型选择对应的buildspec修改方案:
- 如果你使用的是Tomcat平台:
调整artifacts配置,确保最终输出的构件结构可被EB直接识别:
version: 0.2 phases: pre_build: commands: - echo In the pre_build phase... build: commands: - echo Build started on `date` - mvn clean package post_build: commands: - echo Build completed on `date` # 重命名为ROOT.war确保作为根路径应用部署 - mv target/myapp.war target/ROOT.war artifacts: files: - ROOT.war base-directory: target discard-paths: yes
修改后构件包内只有ROOT.war一个文件,EB会自动识别并部署该war包。
- 如果你使用的是Java SE平台:
需要新增Procfile指定应用启动命令,调整后的buildspec如下:
version: 0.2 phases: pre_build: commands: - echo In the pre_build phase... build: commands: - echo Build started on `date` - mvn clean package post_build: commands: - echo Build completed on `date` - mv target/myapp.war target/ROOT.war # 新增启动配置文件 - echo 'web: java -jar ROOT.war' > target/Procfile artifacts: files: - ROOT.war - Procfile base-directory: target discard-paths: yes
增强型健康授权排查
如果修改配置后仍有健康状态异常,按以下步骤确认权限配置:
- 检查EB环境关联的EC2实例角色,确认已附加
AWSElasticBeanstalkEnhancedHealth托管策略 - 检查CodePipeline部署阶段的服务角色,确认已配置
elasticbeanstalk:*、s3:GetObject、s3:ListBucket等EB部署所需权限 - 下载EB环境的全量日志,查看
/var/log/catalina.out(Tomcat平台)或/var/log/web.stdout.log(Java SE平台)的启动报错,定位具体异常原因
内容的提问来源于stack exchange,提问作者Kamil Wielgosz
相关产品推荐
相关产品推荐

