使用 AWS CodeDeploy 和 Auto Scaling 组实现蓝绿部署

阅读数:149 2019 年 11 月 12 日 08:00

使用AWS CodeDeploy和Auto Scaling组实现蓝绿部署
_ 原文: https://aws.amazon.com/blogs/devops/performing-bluegreen-deployments-with-aws-codedeploy-and-auto-scaling-groups/ _
复制代码
_ 作者:Jeff Levine,Amazon Web Services 解决方案架构师 _
---
AWS 提供的服务能够帮助大家利用云的力量来满足开发和部署的需求。AWS CodeDeploy 可自动将代码部署到 Amazon EC2 或本地实例,并支持蓝绿部署方式。在这篇博文中,将讨论蓝绿部署的好处,并展示如何实现。
** 蓝绿部署的好处 **
蓝绿部署涉及两个生产环境:
* 蓝色环境指代正在使用的生产环境。
* 绿色环境则将发布一个新版本。
以下是蓝绿部署的一些优点:
* 可在绿色环境下进行测试,而不会中断蓝色环境。
* 切换到绿色环境不需要停机,只需要重定向用户流量。
* 问题发生时,可很方便地从绿色环境回滚到蓝色环境,只要将流量重定向回蓝色环境即可,而无需重新构建。
* 需要变更时,利用不可变基础设施原则初始化新的实例,避免实例配置产生不一致性。
**AWS CodeDeploy 提供了两种蓝绿部署的方式:**
* 第一种,AWS CodeDeploy 为 Auto Scaling 组创建了副本,启用新的 Amazon EC2 实例,将应用程序部署到这些新实例,然后重定向用户流量重定到新部署的代码。
* 第二种,可使用实例标签或 Auto Scaling 组来选择用于绿色环境的实例。AWS CodeDeploy 会将代码部署到标记的实例上。
那么,如何设置你的第一个蓝色环境?最佳做法,当然是采用 AWS CodeDeploy 的 in-place 部署方式。当然也可以从已有的空白 Auto Scaling 组开始。
** 蓝绿部署的示例 **
我们来看一下如何使用 Auto Scaling 组来实现蓝绿部署。
** 概述 **
下图中,示例环境包括一组 Amazon EC2 实例,可作为 AWS CodeDeploy 的工作站。服务发布管理员或开发人员可以使用此工作站部署新版本的代码。蓝色环境包含一个 Auto Scaling 组,其中另有两个实例用作 Web 服务器。 Web 服务器,最初将包含应用程序的第一个版本和 AWS CodeDeploy 客户端。负载均衡器以轮转的方式,将流量引导到两个 Web 服务器。
服务发布管理员使用工作站实例,将新版本的应用程序推送到 AWS CodeDeploy,并启动蓝绿部署。 AWS CodeDeploy 会创建 Auto Scaling 组的副本,启动两个新的 Web 服务器实例,并安装新版本的应用程序,然后将负载均衡器重定向到新实例。 原实例仍然是原 Auto Scaling 组的一部分。 如果需要,均可重新关联到负载均衡器中。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-1.png)
** 构建该示例的先决条件 **
以下是需要的准备工作。
* 具有使用 Amazon EC2,Amazon S3,Amazon VPC,AWS CodeDeploy 和 AWS CloudFormation 权限的 IAM 用户。
* 选定构建示例环境的 AWS 区域和可用区域。
* Amazon EC2 密钥对。
* 熟悉上述服务和 AWS 管理控制台,如何连接到 Amazon EC2 实例。
** 其他注意事项 **
本示例中,您将会为使用到的基础 AWS 服务付费,本例中提供的资源仅为培训目的。 在实施与本博文中描述的类似技术时,请务必考虑相关的安全需求。
#### 步骤 1:创建初始环境
1. 下载包含示例模板的存档,并将其保存在相应的目录。https://github.com/awslabs/codedeploy-blue-green/
2. 登录到 AWS 管理控制台并打开 AWS CloudFormation 控制台,网址为 https://console.aws.amazon.com/cloudformation/
3. 如果这是一个新的 AWS CloudFormation 帐户,请单击 ** 创建新堆栈 ** 。 否则,单击 ** 创建堆栈 **
4. 在 ** 将模板上传到 Amazon S3** 选项中 ,单击 **Choose File**,从您下载的存档中选择 YAML 文件,然后单击下一步 。
5. 在 ** 指定详细信息的堆栈名称 ** 中,输入 bluegreen 。
6. 在 **AZName** 中 ,选择一个可用区域。 (在这篇博文中,使用 us-east-1a)
7. 在 **BlueGreenKeyPairName** 中 ,选择要使用的密钥对。
8. 在 **NamePrefix** 中 ,使用 bluegreen 的默认值,除非已经运行了以 bluegreen 开头的名称的应用 bluegreen 。NamePrefix 用于为创建的资源分配名称标签。 单击 ** 下一步 **
9. 在 ** 选项 ** 页面上,单击 ** 下一步 **
10. 选择 ** 确认框 ** 以允许创建 IAM 资源,然后单击 ** 创建 ** 。CloudFormation 将需要大约 10 分钟来创建示例环境。除了创建图中所示的基础设施之外,CloudFormation 模板还设置了一个 AWS CodeDeploy 应用程序和蓝绿部署组。
#### 步骤 2:查看初始环境
1. 看看 CloudFormation 的堆栈输出。应该会看到以下类似内容。 WorkstationIP 是工作站实例的 IP 地址。 AutoScalingGroup 和 LoadBalancer 是由 CloudFormation 为 Auto Scaling 组和弹性负载均衡器创建的 DNS 名称。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-2.png)
2. 将 LoadBalancer 值复制到浏览器中并浏览到该链接,将会显示以下应用程序。这是一个 PHP 应用程序,用来查询 Amazon EC2 实例的元数据。 如果刷新页面,则会根据轮转的负载均衡算法,看到 IP 地址和实例 ID 的变化。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-3.png)
3. 回到 EC2 控制台,查看实例。将看到与此示例相关联的三个运行中的实例:工作站和 Auto Scaling 组创建的两个 Web 服务器实例。这些 Web 服务器实例构成蓝色环境。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-4.png)
#### 步骤 3:部署新版本的代码
1. 通过 WorkStationIP 中显示的地址,连接到工作站实例 。这个实例正在运行 Ubuntu 操作系统,用户名是 ubuntu 。登录后,将看到两个目录:scripts 目录包含 Bourne shell 脚本;newversion 目录包含对 PHP 应用程序的更新。
2. 以下是 newversion/content/index.php 中新版本的 PHP 代码。 与最初安装代码的唯一区别是应用程序版本号。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-5.png)
3. 现在看下面的 scripts/pushnewversion.sh 的 shell 脚本。使用 aws deploy push 命令,将代码打包,上传到 Amazon S3。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-6.png)
4. 运行 pushnewversion.sh 脚本,将看到一条消息,告诉您如何使用 AWS 命令行解释器来部署代码,不过这里我们将使用 AWS CodeDeploy 控制台来部署。
5. 打开 AWS CodeDeploy 控制台 https://console.aws.amazon.com/codedeploy/
6. 点击 bluegreen-app 的链接。 如果选择了 **NamePrefix** 的默认名称,请改为单击该名称,展开 **Revisions**,将看到刚从工作站实例推送的修订版本,单击 **Deploy revision**
7. 在 **Create Deployment** 页面上,选择 bluegreen-app 应用程序和 bluegreen-dg 部署组。保留所有其他默认值,然后单击 **Deploy**。AWS CodeDeploy 将配置 Auto Scaling 组和实例,部署代码,设置运行状况检查以及将流量重定向到新实例。这个过程需要几分钟。部署完成后,如下图所示。由于部署组中的设置,AWS CodeDeploy 会跳过终止原始实例这一步。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-7.png)
#### 步骤 4:查看更新的环境
1. 在浏览器上打开负载均衡器的 DNS 地址。应该看到新版本的应用程序,如下图所示。应用程序版本从 1 变为 2,如预期。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-8.png)
2. 回到 EC2 控制台并查看实例。将看到已被 Auto Scaling 组标记的四个实例。 IP 地址为 10.200.11.11 和 10.200.11.192 的实例是我们在蓝色环境中看到的。部署过程创建了现在属于绿色环境的 IP 地址为 10.200.11.13 和 10.200.22 的实例。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-9.png)
3. 转到 Auto Scaling 组控制台 。将看到现在有两个 Auto Scaling 组,每个组有两个实例。 名称以 CodeDeploy 开头的 Auto Scaling 组是在部署过程中创建的。
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/20170723-10.png)
4. 使用 AWS CodeDeploy 已经成功完成了蓝绿部署。
#### 步骤 5:清理
1. 重新登录到到 AWS CodeDeploy 工作站实例。
2. 运行 scripts/cleanup.sh 脚本。 将会删除部署包并关闭 Auto Scaling 组。
3. 转到 CloudFormation 控制台,选择之前创建的堆栈,然后将其删除。
** 结论 **
AWS CodeDeploy 帮助开发人员将代码部署自动化到 Amazon EC2 和本地实例。其蓝绿部署选项帮助服务发布管理员,创建新的生产环境,并在问题出现时非常便捷地回滚到之前的环境。 有关 AWS CodeDeploy 的更多信息,请参阅 AWS CodeDeploy 文档 。现在,您只需点击几次即可开始使用。
在蓝绿的世界中享受生活!
** 译者介绍 **
![](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/07/24/henry_huang.jpg)
黄帅,AWS 中国专业服务的咨询顾问,主要为企业客户提供云架构设计、迁移技术指导和 DevOps 落地实践。加入 AWS 之前,有多年企业产品 SaaS 转型的研发和运维经历,以及丰富的 DevOps 实战经验。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/performing-bluegreen-deployments-with-aws-codedeploy-and-auto-scaling-groups/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布