具有自动扩展组,CloudFormation和CodeDeploy的蓝/绿部署

时间:2018-11-09 17:31:59

标签: amazon-web-services amazon-cloudformation autoscaling aws-code-deploy

我尝试通过复制AutoScalingGroup来设置蓝色/绿色部署,但是随着CodeDeploy创建新副本并删除原始副本,这使CloudFormation堆栈脱离了其原始资源。我从另一篇文章(https://forums.aws.amazon.com/thread.jspa?messageID=861085)了解到AWS正在为此进行改进,但是现在我正在尝试以下解决方法。任何想法都会很有帮助。

CloudFormation创建以下内容:

  • 弹性负载均衡器
  • 目标群体
  • AutoScalingGroup One(具有LaunchConfiguration)
  • 第二个AutoScalingGroup(与第一个相同,但没有实例)
  • DeploymentGroup(具有就地DeploymentStyle),可将修订部署到AutoScalingGroup One中

CloudFormation完成后,我在控制台中手动执行以下操作:

  1. 我将创建的部署组更新为部署样式为蓝色/绿色,并将其原始环境设置为AutoScalingGroup One。
  2. 我将实例添加到AutoScalingGroup Two
  3. 我在CodeDeploy中创建一个部署。但是,这不起作用,因为将新实例附加到AutoScalingGroup Two时,它将立即添加到TargetGroup,并且不通过运行状况检查。

关于如何使用CloudFormation实施一组资源以简化蓝绿色部署的任何想法,即单击CodeDeploy,CloudFormation资源仍然保持不变?

1 个答案:

答案 0 :(得分:0)

关于您描述的最初问题,您是否尝试过“健康检查宽限期”?这样可以防止您在实例到达目标组时通过运行状况检查失败描述的问题。

另一种方法(有很多缺点)是调整CloudFormation模板以补偿CodeDeploy在蓝绿色部署中替换ASG时的行为。

  1. 在ASG模板中,创建一个名为“是/否”的参数 “ ManageAutoScalingGroup”。根据值有条件创建ASG 该参数的值为“是”。在的ASG上设置删除策略 保留,以便CloudFormation在 参数更改为“否”。
  2. 使用默认的“是”启动群组 在此参数上。
  3. 实例运行状况良好且CodeDeploy已完成初始就地部署后,您可以将DeploymentGroup更改为使用Blue-Green,其中CodeDeploy将替换您的ASG。
  4. 请确保更新ASG,并将ManageAutoScalingGroup更改为“ no”。 CloudFormation将从您的堆栈中删除该引用,但会将资源保留在原处。

这将为您提供您希望通过CodeDeploy进行的一键式部署,但是请注意,这会带来一些费用:

  • CodeDeploy将不会复制Auto Scaling组的TargetGroup参数(如https://forums.aws.amazon.com/thread.jspa?threadID=249406&tstart=0中其他人的描述)。您应该能够巧妙地使用CloudWatch事件规则和SSM Automation来解决此问题,以在ALB更改状态时将实例标记为不正常。
  • CodeDeploy生成的副本似乎相当不可靠。至少有一次,我看到我的LaunchTemplate版本重置为不正确的值。我还遇到过这样的情况,即部署组无法跟踪应该跟踪的ASG。
  • 继续将模板中的更改应用于ASG是一件很麻烦的事情。 “刷新”组的过程是:1)还原前面描述的参数,以便CloudFormation将生成一个新组。 2)修改部署组以该组为目标并完成就地部署。 3)修改部署组以还原蓝绿色部署并相应地更新堆栈。

我对这个部门的CodeDeploy不太满意。我希望看到它们以与ASG相同的方式工作,而ASG可以在新的LaunchTemplate版本的应用程序上自行替换。如果您感到有些野心勃勃,则可以通过将步进功能与ASG实例生命周期挂钩一起使用来模仿此行为。有时间后,我就会考虑使用这种解决方案。