一 背景
自动化代码部署以确保应用程序正常运行时间Amazon CodeDeploy 是一项完全托管的部署服务,可自动将软件部署到计算服务,例如 Amazon EC2、Amazon Lambda 以及您的本地服务器。借助 Amazon CodeDeploy,您可以更轻松地快速发布新功能、避免在应用程序部署过程中出现停机,并简化应用程序的更新工作。AWS提供的服务能够帮助大家利用云的力量来满足开发和部署的需求。AWS CodeDeploy可自动将代码部署到Amazon EC2或本地实例,并支持蓝绿部署方式。在这篇博文中,将讨论蓝绿部署的好处,并展示如何实现。
二 概述
AWS CodeDeploy旨在帮助用户完成应用的快速部署,按照用户指定的策略将代码部署在一组EC2服务器上。用户策略可以包括集群部署速度、部署事件通知、警报处理策略等。此外,CodeDeploy还可以和弹性负载均衡(Elastic Load Balancer)、自动扩展组(Auto Scaling Group)等服务结合,完成无缝升级和动态部署。
三 相关概念
为方便有效地组织部署任务,CodeDeploy设立了三个概念:应用(Application)、部署(Deployment),以及部署配置(Deployment Configuration)。
3.1 应用程序(Application)
应用程序是部署的核心,由部署组(Deployment Group)和代码修订(Revisions)组成。一个应用可以包含多个部署组,一个部署组又可以包含多台EC2服务器。同时,一个服务器也可以属于多个部署组,因为一个服务器可能同时运行多个应用。
3.1.1 部署组
创建或修改部署组时,如果添加EC2服务器,可以通过标签(Tag)对已有的EC2服务器进行筛选。所以,在创建EC2时一定要打上标签(Tag),便于在创建应用的部署组时找到对应业务的服务器。
此外,部署组还可以添加自动扩展组(Auto Scaling Group),以及用户自己机房的主机(On-Premise Instance)。
3.1.2 代码修订
代码修订保存了当前应用涉及到得所有代码,代码的存放位置可以在S3或Github。
如果用户自建代码托管,当需要部署时,可以在工作机上同步代码到本地,然后使用AWS命令行进行打包上传。
上面的命令可以将运行目录下得代码打包上传到S3,同时显示在关联应用的代码修订一栏中。
3.2 部署(Deployment)
每一次部署都有唯一的ID标记,并保存所有信息,如代码来源、部署时间、目标服务器、部署结果等。并且针对每一台服务器,都可以详细查看部署过程中的事件(如下载程序、安装前检查、 程序启动、安装后检查等7个事件),以便追踪部署的各个步骤。当部署出错时,可以快速定位和排查。
3.3 部署配置
部署配置存放了一次部署的服务器台数或百分比,在发起部署时需要指定所需配置。CodeDeploy默认提供了三种配置:一次部署一台、一次部署一半数量的服务器,以及一次完成全部部署。部署发起后,CodeDeploy会按照上述策略进行工作,指导完成部署组内全部服务器的更新。
3.4 蓝绿部署
蓝绿部署涉及两个生产环境:
- 蓝色环境指代正在使用的生产环境。
- 绿色环境则将发布一个新版本。
以下是蓝绿部署的一些优点:
- 可在绿色环境下进行测试,而不会中断蓝色环境。
- 切换到绿色环境不需要停机,只需要重定向用户流量。
- 问题发生时,可很方便地从绿色环境回滚到蓝色环境,只要将流量重定向回蓝色环境即可,而无需重新构建。
四 实现流程
4.1 架构图
4.2 实现流程
- 创建应用程序,标识部署应用程序版本及计算平台。
- 指定部署类型配置部署组,可以指定应用于实例的标签、Amazon EC2 Auto Scaling组名,需在实例中安装并正常运行CodeDeploy。
- 指定部署配置,指定您的应用程序需同时部署多少实例,及部署成功和失败条件。
- 应用程序需通过CodeBuild或其他方式提前上传至Amazon S3或Github,应用程序需保护部署期间用到的脚本,还需要包含应用程序AppSpec文件。
- 将应用程序修订部署到部署组。
- 检查部署结果。
五 实战
5.1 源项目
5.2 CodeCommit
5.2.1 创建codecommit仓库
5.2.2 创建IAM用户
- 创建具备CodeCommit权限的IAM用户
- 为用户生成codeCommit凭证
- 提交代码到codeCommit中
5.3 CodeBuild
提前创建好存储golang 构件的S3,创建用具备codebuild权限的IAM角色
开始构件测试
查看对下存储构件结果
5.4 CodeDeploy
提前创建好auto scaling。
创建应用程序
创建部署组
创建部署
查看已完成应用部署
在主机内部可以查看进程
已完成流量切换
通过LB进行测试
5.5 CodePipeline
创建管道
添加源阶段
添加构建阶段
添加部署阶段
查看审阅
六 测试
修改API 版本为V3,提交代码查看Pipeline。
查看正在部署
测试API接口
已完成新版本发布,在此测试停止并回滚部署。
开始恢复流程
完成回滚
测试API已经回滚
七 注意事项
- 代码存储和版本控制: 使用CodeCommit作为代码存储和版本控制系统,确保代码安全且易于追踪变更。
- 自动化构建和测试: 利用CodeBuild自动构建和测试代码,及时捕获潜在的代码问题。
- 部署策略: 使用CodeDeploy选择合适的部署策略(如蓝绿部署、金丝雀发布等),以便在生产环境中实现零停机时间和快速回滚。
- 持续集成与持续部署: 将整个流程组织在CodePipeline中,实现持续集成和持续部署,提高开发效率。
- 环境变量和凭据管理: 使用AWS Secrets Manager或AWS Systems Manager Parameter Store等服务管理敏感信息,确保应用安全。
- 监控和报警: 使用AWS CloudWatch监控应用性能,配置报警通知以便在出现问题时及时响应。
- 基础设施即代码: 使用AWS CloudFormation或Terraform等工具管理基础设施,确保基础设施的一致性和可追溯性。
参考链接
- aws.amazon.com/cn/blogs/ch…