AWS CodeDeploy健康检查约束错误:EC2与GitHub部署问题排查
我之前也碰到过一模一样的问题!折腾了大半天终于捋出几个最容易踩的坑,你可以按这个顺序逐一排查:
检查EC2实例与部署组的标签匹配
CodeDeploy完全依赖标签来定位目标实例,哪怕是大小写不一致都会导致匹配失败。比如部署组设置的筛选标签是App=MyService,但EC2实例的标签是app=myservice,这就会让CodeDeploy找不到你的实例。建议直接复制部署组里的标签键值,去EC2控制台的实例标签页核对,确保完全一致。查看CodeDeploy Agent的详细日志
别只确认Agent启动了,日志里藏着最直接的线索。登录EC2实例后,Linux系统可以查看日志文件:tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log重点搜索
health、registration failed、connection refused这类关键词。我当时就是在日志里发现Agent无法和CodeDeploy服务建立HTTPS连接,后来才知道是EC2安全组没开放出站443端口到CodeDeploy的服务端点。核实IAM角色的权限细节
哪怕你觉得IAM配置没问题,也得再仔细核对两个关键角色:- EC2实例的IAM角色:必须包含
codedeploy:RegisterInstance、codedeploy:UpdateInstanceInformation权限,同时如果你的修订存储在S3或GitHub,还要有对应的数据读取权限; - CodeDeploy服务角色:需要
ec2:DescribeInstances、ec2:DescribeTags权限,否则无法获取EC2实例的状态信息。
- EC2实例的IAM角色:必须包含
检查健康检查配置
如果你的部署组用了自定义健康检查(比如HTTP/HTTPS检查),一定要确认实例上的目标服务已经正常启动,健康检查路径能返回200状态码。比如你配置了/health作为检查路径,但应用还没完成部署或者这个路径未正确配置,就会被判定为不健康。如果用的是默认的EC2状态检查,去EC2控制台确认实例的系统状态和实例状态都是“正常”。排查部署组的特殊设置
检查部署组的以下配置:- 有没有误将目标实例标记为“排除部署”;
- 部署配置里的最小健康实例百分比是否合理——比如单个实例的话,别设置成100%(虽然CodeDeploy对单实例有特殊处理,但偶尔也会出现判定异常);
- 是否开启了“在终止旧实例前等待新实例健康”这类选项,导致单实例部署时卡住。
尝试重启Agent并重新触发部署
有时候Agent会出现注册异常,重启一下可能解决问题:sudo service codedeploy-agent restart重启后等待几分钟,再去CodeDeploy控制台的“实例”页面看看能不能看到你的EC2实例,如果还是看不到,那大概率是前面的标签、IAM或网络问题导致的注册失败。
内容的提问来源于stack exchange,提问作者user5390180

