CloudFormation蓝绿部署报错:目标组master-tg-2未关联负载均衡排查
排查CloudFormation蓝绿部署中目标组未关联负载均衡的错误
我帮你梳理下这个问题的核心原因和修复方案,你遇到的报错和模板里的几处配置问题直接相关:
核心错误根源
当使用CODE_DEPLOY作为ECS部署控制器实现蓝绿部署时,只需要将一个目标组绑定到负载均衡的监听器(也就是你配置的MasterTGOne)。另一个目标组(MasterTGTwo)是由CodeDeploy在部署流程中动态完成关联切换的,不需要提前通过ECS Service的LoadBalancers列表绑定。你现在把两个目标组都加到了ECS Service的负载均衡配置里,而且MasterTGTwo没有被关联到任何LB监听器,这就触发了CloudFormation的报错。
模板里的其他语法问题
除了上面的逻辑错误,你的模板还有几处引用外部栈输出的语法问题,这些也会导致部署失败:
- 目标组的
VpcId直接写了字符串"${TasStackName}:VPCId",需要用!ImportValue来正确引用外部栈的输出值 - ECS Service的
Cluster、Role、Subnets同样没有使用正确的引用方式,必须用!ImportValue来获取外部栈的资源标识
修正后的关键模板片段
下面是修复后的核心代码部分:
MasterTGOne: # Means MasterTargetGroupOne Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: master-tg-1 Port: 8000 Protocol: HTTP VpcId: !ImportValue !Sub "${TasStackName}:VPCId" TargetType: ip ## to be used as a spare TargetGroup for blue green deployment MasterTGTwo: # Means MasterTargetGroupTwo(修正了注释笔误) Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: master-tg-2 Port: 8000 Protocol: HTTP VpcId: !ImportValue !Sub "${TasStackName}:VPCId" TargetType: ip MasterECSServices: Type: AWS::ECS::Service DependsOn: - MasterLBListener Properties: Cluster: !ImportValue !Sub "${TasStackName}:ClusterName" DeploymentController: Type: CODE_DEPLOY DesiredCount: 1 LaunchType: FARGATE LoadBalancers: # 只保留一个目标组,另一个由CodeDeploy负责动态关联 - ContainerName: master-app ContainerPort: '8000' TargetGroupArn: !Ref 'MasterTGOne' NetworkConfiguration: AwsvpcConfiguration: SecurityGroups: - !Ref MasterAppSG Subnets: - !ImportValue !Sub "${TasStackName}:PrivateSubnetOne" - !ImportValue !Sub "${TasStackName}:PrivateSubnetTwo" Role: !ImportValue !Sub "${TasStackName}:ECSRole" TaskDefinition: !Ref 'MasterTaskDef'
额外说明
- 蓝绿部署的流量切换逻辑完全由CodeDeploy管控:部署新版本时,它会将流量从
MasterTGOne切换到MasterTGTwo,部署完成后再根据你的配置决定保留或清理旧目标组的资源 - 确保你已经提前配置了对应的CodeDeploy应用和部署组,并且部署组已经关联了这两个目标组和ECS服务
内容的提问来源于stack exchange,提问作者Moses Liao GZ
相关产品推荐
相关产品推荐

