AWS CodeDeploy 的部署策略 - 面向 EC2 / ECS / Lambda 的蓝绿部署
统一管理支持 EC2 / ECS / Lambda 三个平台的部署策略。介绍 ECS 蓝绿部署以及与 CloudWatch 告警联动的自动回滚。
CodeDeploy 支持的平台与部署类型
CodeDeploy 是支持 EC2/本地、ECS、Lambda 三个平台的部署服务。在 EC2/本地上,可以选择就地部署(依次更新现有实例)和蓝绿部署(创建新的实例组后切换)。ECS 仅支持蓝绿部署,会启动新的任务集并切换目标组。Lambda 提供基于流量转移的分阶段部署。使用 CodeDeploy 部署到 EC2、Lambda、ECS 时不收取额外费用,而部署到本地实例时,每次更新实例都会收费。
ECS 蓝绿部署的设计
在 ECS 的蓝绿部署中,在 ALB 上设置 2 个目标组(生产用和测试用)。部署开始时,新的任务集(Green)会启动并注册到测试用目标组。通过测试监听器端口确认 Green 环境的运行情况,如果没有问题,就将生产监听器的流量切换到 Green。切换后,旧任务集(Blue)也会在指定的等待时间(默认 1 小时)内保留,因此出现问题时可以恢复到原来的任务集。可以构建这样的配置:在 AppSpec 文件的 AfterAllowTestTraffic 钩子中运行自动化测试,测试失败时自动回滚。
自动回滚与告警联动
CodeDeploy 的自动回滚通过部署失败和 CloudWatch 告警触发这两种触发条件来运行。在与 CloudWatch 告警的联动中,会监控部署后的错误率(5xx 响应的比例)、延迟(p99 响应时间)和业务指标(订单成功率等)。超过阈值时,会自动回滚到上一个版本。在 Lambda 的流量转移中,Canary 部署首先将 10% 的流量导向新版本,如果在指定的时间(例如 10 分钟)内告警没有触发,就切换剩余的 90%。Linear 部署以每次 10% 的方式分阶段迁移流量,并在每个步骤中监控告警。
CodeDeploy 的费用
使用 CodeDeploy 部署到 EC2、Lambda、ECS 时不收取额外费用,收费的是本地实例的更新。在蓝绿部署中,临时运行 2 倍资源的期间会产生计算费用,但 CodeDeploy 本身没有额外费用。在 ECS 的蓝绿部署中,从 Green 任务集启动到流量切换期间,Blue 和 Green 两边的任务都在运行,因此会增加这段期间的 Fargate 或 EC2 费用。通过缩短切换后 Blue 任务集的保留时间,可以降低成本。
部署配置与流量转移
在 CodeDeploy 中,可以通过配置选择切换到新版本时流量的转移方式。一次性全部切换的方式速度快,但如果有问题会影响所有用户。如果采用从极小一部分开始逐步增加的金丝雀方式,或按固定比例分阶段转移的线性方式,就可以及早发现异常并控制损失。在 Lambda 中,使用别名在版本之间调整流量的比例,平稳地进行切换。根据风险的容忍度选择切换方式,可以在控制停机时间和故障影响的同时发布新版本。
EC2 部署的方式
在部署到 EC2 或本地服务器时,可以选择依次更新运行中实例的就地方式,以及先建立新的实例群再切换的蓝绿方式。蓝绿方式在出现问题时容易恢复到原来的环境,但临时需要双倍的资源。部署的对象通过标签等方式定义为部署组。由于可以在部署的各个阶段插入任意处理,因此可以加入启动前后的准备和验证。根据应用程序的特性和对停机时间的容忍度,选择合适的方式。
CI/CD 管道集成
CodeDeploy 可以作为 CI/CD 管道的一部分加入其中。可以构建在管道的最后阶段自动部署经过构建和测试的产物的流程。部署的步骤以及在各个阶段运行的验证处理,以声明式的方式写在定义文件中。这样,部署的内容就作为代码进行管理,并保持可重现性。不经过人工操作,将从提交到部署的过程自动化,可以在提高发布频率的同时减少人为错误。加入管道的部署会成为持续交付的一部分。
安全发布的最佳实践
安全部署的关键在于建立能够及早发现问题并自动恢复的机制。在部署过程中运行验证处理,确认新版本是否正常运行。如果监控发布后的指标,并设置为在检测到错误率上升等异常时自动回滚,就更容易控制损失。与分阶段转移流量的方式相结合,就能在全面切换之前发现问题。不一下子向所有用户推出,而是小规模试行并在确认的同时逐步扩大,将这一原则作为机制加入其中,会带来可靠的发布运维。
总结
CodeDeploy 是统一管理面向 EC2、ECS、Lambda 的安全部署的服务。通过蓝绿部署和流量转移控制生产环境的风险,并与 CloudWatch 告警联动,在出现问题时可以自动回滚。借助 AppSpec 的生命周期钩子,可以将测试加入部署流程,在部署的自动化中运行测试。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。