aws cloudformation 使用模板配置 ecs 蓝绿部署

参考资料

在之前的文章中,使用codepipeline中通过控制台的方式创建了ecs蓝绿部署的demo。实际上可以单独通过codedeploy完成ecs服务的蓝绿部署

参考官方文档对cfn模板的描述,堆栈会创建以下资源

RequirementResourceRequired/OptionalTriggers blue/green deployment if replaced
Amazon ECS clusterAWS::ECS::ClusterOptional. The default cluster can be used.No
Amazon ECS serviceAWS::ECS::ServiceRequired.No
Application or Network Load BalancerAWS::ECS::Service LoadBalancerRequired.No
Production listenerAWS::ElasticLoadBalancingV2::ListenerRequired.No
Test listenerAWS::ElasticLoadBalancingV2::ListenerOptional.No
Two target groupsAWS::ElasticLoadBalancingV2::TargetGroupRequired.No
Amazon ECS task definitionAWS::ECS::TaskDefinitionRequired.Yes
Container for your Amazon ECS applicationAWS::ECS::TaskDefinition ContainerDefinition NameRequired.No
Port for your replacement task setAWS::ECS::TaskDefinition PortMapping ContainerPortRequired.No

模板中最重要的部分如下,完整配置需要参考 Template reference

添加hook部分并定义部署的具体配置,配置中所有资源都引用堆栈中资源的逻辑id

Transform:
  - 'AWS::CodeDeployBlueGreen'
Hooks:
  CodeDeployBlueGreenHook:
  	Type: 'AWS::CodeDeploy::BlueGreen'
    Properties:
      TrafficRoutingConfig:
        Type: TimeBasedCanary
        TimeBasedCanary:
          StepPercentage: 15
          BakeTimeMins: 5
      Applications:
        - Target:
            Type: 'AWS::ECS::Service'
            LogicalID: ECSDemoService
          ECSAttributes:
            TaskDefinitions:
              - BlueTaskDefinition
              - GreenTaskDefinition
            TaskSets:
              - BlueTaskSet
              - GreenTaskSet
            TrafficRouting:
              ProdTrafficRoute:
                Type: 'AWS::ElasticLoadBalancingV2::Listener'
                LogicalID: ALBListenerProdTraffic
              TargetGroups:
                - ALBTargetGroupBlue
                - ALBTargetGroupGreen

当对以下资源进行更新时,CloudFormation 将启动绿色部署:

  • AWS::ECS::TaskDefinition
  • AWS::ECS::TaskSet

更新不需要进行资源替换的资源中的属性不会触发绿色部署

原则上就是对任务相关的资源和基础设施资源的堆栈更新要分开进行,建议创建更改集进行操作

要取消仍在进行的绿色部署,需要取消 CloudFormation 中的堆栈更新

嵌套堆栈中不能用 AWS::CodeDeploy::BlueGreen 钩子

使用cloudfromation进行ecs蓝绿部署不需要对codedeploy的应用和部署组进行配置

  • Your template does not need to model resources for a CodeDeploy application or deployment group.
  • Your template must include resources for a VPC using Amazon VPC that contains at least two subnets.
  • Your template must include resources for a Classic Load Balancer, Application Load Balancer, or Network Load Balancer in Elastic Load Balancing that is used to direct traffic to your target groups.

为了使cfn成功执行蓝绿部署,必须具有以下权限:

  • codedeploy:Get*
  • codedeploy:CreateCloudFormationDeployment

修改堆栈中的任务定义中image并更新堆栈,触发堆栈的宏'AWS::CodeDeployBlueGreen'

BlueTaskDefinition:
    Type: 'AWS::ECS::TaskDefinition'
    Properties:
      ExecutionRoleArn: !GetAtt 
        - ECSTaskExecutionRole
        - Arn
      ContainerDefinitions:
        - Name: DemoApp
          Image: 'nginxdemos/hello:latest' # 修改之后更新堆栈
          Essential: true
          PortMappings:
            - HostPort: 80
              Protocol: tcp
              ContainerPort: 80
      RequiresCompatibilities:
        - FARGATE
      NetworkMode: awsvpc
      Cpu: '256'
      Memory: '512'
      Family: ecs-demo

堆栈的具体更新事件
在这里插入图片描述

可以看到,虽然没有创建codedeploy部署组但是触发了部署行为

在这里插入图片描述

观察到流量切换

在这里插入图片描述
熟悉的套路,通过alb监听权重切换流量
在这里插入图片描述

具体的逻辑和pipeline的蓝绿部署类似,只是配置和触发都要通过cfn来进行了

posted @ 2023-01-01 00:26  zhaojie10  阅读(12)  评论(0)    收藏  举报  来源