解决AWS CodeDeploy报错:EC2实例未进入目标组预期闲置状态
解决AWS CodeDeploy结合ALB时Block Traffic钩子卡住的问题
核心排查与解决步骤
- 补全CodeDeploy服务角色的ALB权限:确保CodeDeploy服务角色拥有
elasticloadbalancing:DeregisterTargets和elasticloadbalancing:DescribeTargetHealth权限。未使用ALB时无需这些权限,启用ALB后必须配置,否则CodeDeploy无法操作目标组实例状态。 - 优化目标组注销与健康检查逻辑:
- 若应用存在长连接(如WebSocket、持久化数据库连接),60秒的注销延迟可能不足以完成连接清理,可临时调至120秒,同时在应用中添加优雅关闭逻辑(收到SIGTERM信号后主动断开所有长连接)。
- 确认健康检查路径能准确反映实例状态:停止应用后,健康检查需返回5xx或无响应,确保目标组快速将实例标记为不健康。若健康检查仍返回200,实例会持续接收流量,无法进入unused状态。
- 检查代理日志定位细节:登录EC2实例查看
/var/log/aws/codedeploy-agent/codedeploy-agent.log,搜索BlockTraffic关键词,排查是否存在API调用失败、目标组状态查询超时等具体报错。 - 验证目标组会话粘性配置:若目标组开启了会话粘性,需确保粘性超时时间小于注销延迟,避免新流量持续路由至待注销实例。
临时应急方案
- 跳过Block Traffic钩子:在CodeDeploy部署组的自定义部署配置中,将Block Traffic环节设为
SKIP。注意:此操作会导致部署期间实例仍接收流量,可能出现新旧版本混合访问,仅适合非生产环境或低流量时段紧急部署。 - 手动预注销实例:部署前手动从目标组注销待更新的实例,等待实例状态变为
unused后再启动CodeDeploy部署,绕过钩子环节的自动等待逻辑。
内容的提问来源于stack exchange,提问作者Mahabubur Rahman
相关产品推荐
相关产品推荐

