【问题标题】:AWS CloudFormation blue/green deployments for EC2适用于 EC2 的 AWS CloudFormation 蓝/绿部署
【发布时间】:2021-09-16 15:09:28
【问题描述】:

AWS CloudFormation 是否支持 EC2 的蓝/绿部署? 我能够使用 CodeDeploy for EC2 创建蓝/绿部署;但是,我不知道如何使用 CloudFormation 创建一个。 CloudFormation 似乎支持 ECS (https://aws.amazon.com/about-aws/whats-new/2020/05/aws-cloudformation-now-supports-blue-green-deployments-for-amazon-ecs/) 和 Lambda 函数的蓝/绿部署。

模板的 CodeDeploy 部分如下所示:

Type: AWS::CodeDeploy::DeploymentGroup
Properties:
    DeploymentGroupName: 'SampleGroupName'
    ServiceRoleArn: !Sub 'arn:aws:iam::${AWS::AccountId}:role/AzureDevOps/CodeDeployOperations'
    ApplicationName: !Ref CodeDeployApplication
    AutoScalingGroups:
    - !Ref SampleASG
    DeploymentStyle:
    DeploymentType: BLUE_GREEN
    DeploymentOption: WITH_TRAFFIC_CONTROL
    BlueGreenDeploymentConfiguration:
    TerminateBlueInstancesOnDeploymentSuccess:
        Action: TERMINATE
        TerminationWaitTimeInMinutes: 5
    DeploymentReadyOption:
        ActionOnTimeout: CONTINUE_DEPLOYMENT
    GreenFleetProvisioningOption:
        Action: COPY_AUTO_SCALING_GROUP  
    DeploymentConfigName: !If [IsProdStaging, CodeDeployDefault.HalfAtATime, CodeDeployDefault.AllAtOnce]
    LoadBalancerInfo:
    TargetGroupInfoList:
        - Name: !GetAtt SampleTargetGroup.TargetGroupName
    AutoRollbackConfiguration:
    Enabled: true
    Events:
        - DEPLOYMENT_FAILURE

【问题讨论】:

  • 您的 CloudFormation 模板是什么?为什么它不起作用?
  • 谢谢@Marcin 我已经更新了描述以包含 CF 模板的 Codedeploy 部分。该问题似乎与 AutoScaling 有关。
  • 您必须准确解释您的代码有什么问题?有任何错误信息吗?
  • @Marcin 我联系了 AWS Support 团队,AWS Cloudformation 目前似乎不支持 EC2 的蓝/绿部署。感谢您的帮助。
  • @pimir 谢谢,在找到这个之前,我已经花了很长时间寻找解决方案。您是否找到任何解决方法,或者只是使用 In Place 设置模板,然后在控制台中手动将其更改为蓝绿色?

标签: amazon-web-services amazon-ec2 build amazon-cloudformation devops


【解决方案1】:

截至目前(2021 年 10 月),如果您使用的是 EC2,AWS仍然不支持通过 CloudFormation 进行蓝/绿部署。在DeploymentStylesection of the docs中有一个蓝色的注释,阅读:

对于蓝/绿部署,AWS CloudFormation 支持在 仅限 Lambda 计算平台。您可以执行 Amazon ECS 蓝/绿 使用 AWS::CodeDeploy::BlueGreen 挂钩进行部署。

由于没有好的解决方法,这不可用是非常令人沮丧的。

【讨论】:

    【解决方案2】:

    实际上,如果您使用 CloudFormation 为 EC2 设置必要的基础设施,那么有一个解决方法应该相当容易。使用 CloudFormation,您可以创建带有新版本的第二个堆栈,即所谓的绿色堆栈。对于逐步发布,您可以:

    1. 创建额外的 DNS 层,以便将流量路由到:蓝色和绿色,是一定比例,或者
    2. 蓝色和绿色堆栈前面的附加负载平衡器。

    示例案例

    例如假设您有一个包含 Auto Scaling Group (ASG) 和负载均衡器的堆栈。您的服务 DNS 名称 myservice.com 路由到附加到负载均衡器的弹性 IP (EIP)。要部署新版本,您只需更改 ASG 的 AMI ID。

    选项 1

    1. 创建 DNS 记录 blue.myservice.com 并将当前堆栈的 EIP(所谓的蓝色)设置为目标路由。
    2. 使用 DNS 记录 green.myservice.com 创建第二个堆栈(绿色堆栈),并将其定位到使用此新堆栈创建的 EIP。
    3. 通过更改 AMI ID 将新版本部署到新创建的绿色堆栈。
    4. 现在更改 myservice.com 的路由,并以您认为合适的比例定位 blue.myservice.comgreen.myservice.com .
    5. 出于测试目的,您现在可以直接定位 green.myservice.com
    6. 如果绿色的验证或测试正常,您可以使用 ASG 扩展新实例并将更多流量路由到绿色堆栈,然后对蓝色堆栈进行除垢。
    7. 执行此操作,直到所有流量都为绿色。
    8. 现在,您可以完全更新“蓝色”堆栈并将流量更改回那个堆栈,或者通过在其上部署新版本将其用作未来的“绿色”堆栈。

    当然,这种解决方案可能会导致很多问题,并且不是蓝绿色,因为即使新的损坏版本已被删除,DNS 缓存也会导致缓存验证期中断。因此,我认为使用负载均衡器是一个更好的解决方案。

    选项 2

    1. 创建第二个“绿色堆栈”;
    2. 创建一个负载平衡器作为附加层,在蓝色和绿色之间分配负载,将流量路由到相应的负载平衡器;
    3. myservice.com 指向那个新的负载均衡器;
    4. 在您更改流量时缩放/取消缩放实例。
    5. 当所有流量都变为绿色时,您就完成了。

    一般 在每种情况下,您很可能希望对一些值进行参数化,以便于逐步更改负载并使整个过程自动化。要自动化整个部署过程,您很可能会在必要时使用一些 CloudWatch 或 EventBridge 规则和 Lambda,这主要取决于您的需求和实践。这应该不是很困难

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2023-02-04
      • 2019-04-13
      • 2020-07-23
      • 2021-10-08
      • 2019-05-20
      • 2019-01-01
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多