使用 Auto Scaling 组、CloudFormation 和 CodeDeploy 的蓝/绿部署

Posted

技术标签:

【中文标题】使用 Auto Scaling 组、CloudFormation 和 CodeDeploy 的蓝/绿部署【英文标题】:Blue/Green deployments with Auto Scaling Groups, CloudFormation and CodeDeploy 【发布时间】:2019-04-13 07:34:15 【问题描述】:

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

CloudFormation 创建以下内容:

弹性负载均衡器 目标群体 AutoScalingGroup One(带有 LaunchConfiguration) AutoScalingGroup 2(相同但没有实例) DeploymentGroup(使用 In-Place DeploymentStyle)将修订版部署到 AutoScalingGroup One

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

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

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

【问题讨论】:

github.com/aws-cloudformation/… 【参考方案1】:

关于您描述的最初问题,您是否尝试过运行状况检查宽限期?当实例命中目标组时,这应该可以防止您描述的健康检查失败的问题。

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

    在 ASG 模板中,创建一个名为“yes/no”的参数 “管理AutoScalingGroup”。根据值有条件地创建 ASG 该参数为“是”。在 ASG 上设置删除策略 保留,以便 CloudFormation 在 参数更改为“否”。 使用默认“是”启动组 在这个参数上。 实例运行良好且 CodeDeploy 完成初始就地部署后,您可以将 DeploymentGroup 更改为使用蓝绿,CodeDeploy 将替换您的 ASG。 确保更新 ASG 并将 ManageAutoScalingGroup 更改为“否”。 CloudFormation 将从您的堆栈中删除该引用,但会将资源保留在原处。

这将通过 CodeDeploy 为您提供所需的一键式部署,但请注意,这会带来一些成本:

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

我对这个部门的 CodeDeploy 印象不深。我希望看到它们以与 ASG 相同的方式工作,该 ASG 将在应用新的 LaunchTemplate 版本时自行替换。如果您觉得有点野心,您可以通过利用带有 ASG 实例生命周期挂钩的 Step Functions 来模仿这种行为。这是我有时间时正在考虑的解决方案。

【讨论】:

感谢您的回复。我们最终放弃了蓝绿色部署,并使用通过 cloudformation 进行更新的就地部署。当 AWS 改进代码部署和 cloudformation 的集成时,我们可能会重新考虑蓝绿部署 自动导入cloudformation上的新资源怎么样? docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…

以上是关于使用 Auto Scaling 组、CloudFormation 和 CodeDeploy 的蓝/绿部署的主要内容,如果未能解决你的问题,请参考以下文章

使用 Auto Scaling 组、CloudFormation 和 CodeDeploy 的蓝/绿部署

sh 在AWS上使用Artillery.io测试您的Web层Auto Scaling组

如何将最新代码推送到 Auto Scaling 组

Auto Scaling 组 AWS 的内存利用率

ec2 实例和 AWS Auto Scaling 组

网络负载均衡器目标组中的 AWS Auto Scaling 目标