Tag: AWS CodeDeploy


使用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组的一部分。 如果需要,均可重新关联到负载均衡器中。

构建该示例的先决条件

以下是需要的准备工作。

  • 具有使用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名称。

2. 将LoadBalancer值复制到浏览器中并浏览到该链接,将会显示以下应用程序。这是一个PHP应用程序,用来查询Amazon EC2实例的元数据。 如果刷新页面,则会根据轮转的负载均衡算法,看到IP地址和实例ID的变化。

3. 回到EC2控制台,查看实例。将看到与此示例相关联的三个运行中的实例:工作站和Auto Scaling组创建的两个Web服务器实例。这些Web服务器实例构成蓝色环境。

步骤3:部署新版本的代码

1. 通过WorkStationIP中显示的地址,连接到工作站实例 。这个实例正在运行Ubuntu操作系统,用户名是ubuntu 。登录后,将看到两个目录:scripts目录包含Bourne shell脚本;newversion目录包含对PHP应用程序的更新。

2. 以下是newversion/content/index.php中新版本的PHP代码。 与最初安装代码的唯一区别是应用程序版本号。

3. 现在看下面的scripts/pushnewversion.sh的shell脚本。使用aws deploy push命令,将代码打包,上传到Amazon S3。

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会跳过终止原始实例这一步。

步骤4:查看更新的环境

1. 在浏览器上打开负载均衡器的DNS地址。应该看到新版本的应用程序,如下图所示。应用程序版本从1变为2,如预期。

2. 回到EC2控制台并查看实例。将看到已被Auto Scaling组标记的四个实例。 IP地址为10.200.11.11和10.200.11.192的实例是我们在蓝色环境中看到的。部署过程创建了现在属于绿色环境的IP地址为10.200.11.13和10.200.22的实例。

3. 转到Auto Scaling组控制台 。将看到现在有两个Auto Scaling组,每个组有两个实例。 名称以CodeDeploy开头的Auto Scaling组是在部署过程中创建的。

4. 使用AWS CodeDeploy已经成功完成了蓝绿部署。

步骤5:清理

1. 重新登录到到AWS CodeDeploy工作站实例。

2. 运行scripts/cleanup.sh脚本。 将会删除部署包并关闭Auto Scaling组。

3. 转到CloudFormation控制台,选择之前创建的堆栈,然后将其删除。

结论

AWS CodeDeploy帮助开发人员将代码部署自动化到Amazon EC2和本地实例。其蓝绿部署选项帮助服务发布管理员,创建新的生产环境,并在问题出现时非常便捷地回滚到之前的环境。 有关AWS CodeDeploy的更多信息,请参阅AWS CodeDeploy文档 。现在,您只需点击几次即可开始使用。

在蓝绿的世界中享受生活!

译者介绍

黄帅,AWS中国专业服务的咨询顾问,主要为企业客户提供云架构设计、迁移技术指导和DevOps落地实践。加入AWS之前,有多年企业产品SaaS转型的研发和运维经历,以及丰富的DevOps实战经验。

自动化部署服务——AWS CodeDeploy 快速入门

作为DevOps和微服务的深入践行者,Amazon在内部积累了许多持续集成、交付和部署的自动化工具和平台。其中, Apollo作为代码部署的自动化平台,每年进行超过5000万次部署。

为了能够让广大开发者和企业用户使用到功能丰富且久经考验的代码部署平台,在Apollo的经验基础上,AWS发布了自动化部署服务——CodeDeploy。

平台介绍

AWS CodeDeploy旨在帮助用户完成应用的快速部署,按照用户指定的策略将代码部署在一组EC2服务器上。用户策略可以包括集群部署速度、部署事件通知、警报处理策略等。此外,CodeDeploy还可以和弹性负载均衡(Elastic Load Balancer)、自动扩展组(Auto Scaling Group)等服务结合,完成无缝升级和动态部署。

为方便有效地组织部署任务,CodeDeploy设立了三个概念:应用(Application)、部署(Deployment),以及部署配置(Deployment Configuration)。

1)应用程序(Application)

应用程序是部署的核心,由部署组(Deployment Group)和代码修订(Revisions)组成。一个应用可以包含多个部署组,一个部署组又可以包含多台EC2服务器。同时,一个服务器也可以属于多个部署组,因为一个服务器可能同时运行多个应用。

1.1)部署组

创建或修改部署组时,如果添加EC2服务器,可以通过标签(Tag)对已有的EC2服务器进行筛选。所以,在创建EC2时一定要打上标签(Tag),便于在创建应用的部署组时找到对应业务的服务器。

此外,部署组还可以添加自动扩展组(Auto Scaling Group),以及用户自己机房的主机(On-Premise Instance)。

1.2)代码修订

代码修订保存了当前应用涉及到得所有代码,代码的存放位置可以在S3或Github。

如果用户自建代码托管,当需要部署时,可以在工作机上同步代码到本地,然后使用AWS命令行进行打包上传。

aws deploy push --application-name <MyAppName> \

      --s3-location s3://<MyBucketName>/<MyNewAppBundleName> \

      --source <PathToMyBundle>

上面的命令可以将运行目录下得代码打包上传到S3,同时显示在关联应用的代码修订一栏中。

2)部署(Deployment)

每一次部署都有唯一的ID标记,并保存所有信息,如代码来源、部署时间、目标服务器、部署结果等。并且针对每一台服务器,都可以详细查看部署过程中的事件(如下载程序、安装前检查、 程序启动、安装后检查等7个事件),以便追踪部署的各个步骤。当部署出错时,可以快速定位和排查。

3)部署配置(Deployment Configuration)

部署配置存放了一次部署的服务器台数或百分比,在发起部署时需要指定所需配置。CodeDeploy默认提供了三种配置:一次部署一台、一次部署一半数量的服务器,以及一次完成全部部署。部署发起后,CodeDeploy会按照上述策略进行工作,指导完成部署组内全部服务器的更新。

如果用户要自定义部署策略,建议使用命令行完成。比如下面的例子创建的配置就是一次完成20%的服务器部署。

aws deploy create-deployment-config --deployment-config-name ThreeQuartersHealthy --minimum-healthy-hosts type=FLEET_PERCENT,value=20

此外,CodeDeploy还可以管理物理主机(或第三方主机)。只要在物理主机上安装和配置CodeDeploy Agent,Agent向CodeDeploy注册完成后,CodeDeploy就可以像管理 EC2服务器一样在物理服务器上部署应用。

服务器配置

CodeDeploy是通过与部署在服务器上的Agent通信,实现代码部署的。

1)服务器角色

由于Agent需要访问S3下载代码,所以EC2服务器需要配置角色(Role)以保证Agent对S3的读取权限。创建一个IAM Policy包含如下内容,在创建所需的角色关联这个Policy。然后,在创建EC2服务器时,关联此角色。

{

  "Version": "2012-10-17",

  "Statement": [

    {

      "Action": [

        "s3:Get*",

        "s3:List*"

      ],

      "Effect": "Allow",

      "Resource": "*"

    }

  ]

}

2)Agent安装

Agent可以在创建EC2时通过User Data安装,也可以登录到服务器上安装。

如果使用User Data安装,模板如下:

#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://bucket-name/latest/install . --region region-name
chmod +x ./install
./install auto

其中,关于bucket-name和region-name,请查阅下面链接,找到对应Region的替换名称。

https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-set-up-new-instance.html

例如,北京Region的User Data是:

#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-cn-north-1/latest/install . --region cn-north-1
chmod +x ./install
./install auto

如果是选择先创建EC2服务器,再安装Agent,请注意使用sudo以root权限安装。详情请见:

https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent-install.html

部署完成后,使用如下命令检验Agent是否工作正常。

sudo service codedeploy-agent status

用户端配置

建议AWS命令行工具(https://aws.amazon.com/cn/cli/),作为开发流程工具,CodeDeploy的功能可以通过命令行快速完成,而不必使用图形界面。安装完成后的配置方法请参考:https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html

如前文所述,用户可以通过aws deploy push命令来完成代码打包上传。但打包内容除了应用程序代码外,还包含了一个AppSpec.yml文件和一些用于处理安装中一个或多个事件的脚本。

AppSpec.yml脚本不仅定义了代码部署的路径,而且指定了部署过程中相关事件的处理脚本。部署事件有7个,可以按需选择指定。

用户把代码、AppSpec.yml、事件脚本通过aws deploy push命令打包上传后,用户就可以通过CodeDeploy图形化平台选择对应的代码修订(Revision)进行部署了。当然,继续使用命令行进行部署,更是高效的方法。

此外,CodeDeploy还可以和常见的持续集成工具协同工作,如Jenkins、Travis CI等。

案例分享

GILT是一家专注服饰的电商平台,成立于2007年,总部位于纽约,员工超过1000人。 2016年1月,GILT以2亿5千万美金的价格被收购。

GILT的特色业务之一就是促销,并且是在每天中午开售。为了能够灵活、快速地应对业务压力,GILT的DevOps团队基于微服务来设计和部署平台,并采用了Docker提高平台的弹性。其部署平台经历过数次演化,目前是第五代平台NOVA(代码已开源)。CodeDeploy在最新一代的平台中,结合Cloudformation完成核心部署工作,NOVA通过AWS API/SDK完成对CodeDeploy和Cloudformation的调用。

扩展阅读
The Story of Apollo – Amazon’s Deployment Engine

http://www.allthingsdistributed.com/2014/11/apollo-amazon-deployment-engine.html

AWS Codedeploy plugin for Jenkins

https://wiki.jenkins-ci.org/display/JENKINS/AWS+Codedeploy+plugin

AWS CodeDeploy for Travis CI

https://docs.travis-ci.com/user/deployment/codedeploy

GILT NOVA

https://github.com/gilt/nova

 

作者介绍

代闻

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在大规模后台架构、物联网应用、媒体行业转型、企业混合IT和自动化运维等方面有着广泛的设计和实践经验。在加入AWS之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。曾任IBM中国软件开发中心软件工程师,从事企业软件和移动平台的开发工作。

新上线!AWS CodeDeploy自动部署初相识

作为一个开发运维人员,您是否还在为:

1.    如何快速地将新版本应用部署到大批量服务器,无论其是云服务器EC2还是本地服务器?

2.    如何在部署过程中消除停机时间?

3.    如何规避易于出错的手工操作?

4.    在遇到问题时,如何快速回滚?并及时向您发送通知?

今天,我们很高兴地宣布:AWS的CodeDeploy服务能够助您一臂之力!它能够协助您将应用程序部署到 Amazon EC2 实例和/或非 Amazon EC2 实例的物理或虚拟设备。应用程序包扩:代码、Web 和配置文件、可执行文件、程序包、脚本等可部署的内容。AWS CodeDeploy 支持从 Amazon S3 存储桶和 GitHub 存储库部署应用程序。

您无需更改现有代码即可使用 AWS CodeDeploy。您可以使用 AWS CodeDeploy 控制跨 Amazon EC2 实例部署的速度,并定义要在每个阶段采取的操作。

AWS CodeDeploy 具备下列优势:

  • 自动部署。AWS CodeDeploy 可完全自动部署应用程序,并随您的基础设施进行扩展,让您能够部署到数千个实例。
  • 最大程度减少停机时间。AWS CodeDeploy 可以最大程度地提高应用程序的可用性。支持滚动部署和蓝/绿部署模式。并根据您配置的规则跟踪应用程序运行状况。
  • 停止并回滚。出现错误时,您可以自动或手动停止和回滚部署。
  • 易于采用。AWS CodeDeploy 与平台无关,适用于任何应用程序。您可以轻松重用设置代码。AWS CodeDeploy 还能与您的软件发布过程或持续交付工具链集成。

AWS CodeDeploy 支持如下2种部署模式

就地部署:对部署组中的实例依次执行脱机操作/更新应用/恢复联机的操作,完成滚动部署。

蓝绿部署:创建一组新的替换实例,并安装新版本的应用程序。成功后,切换流量到这些新实例,删除旧实例,完成部署。AWS CodeDeploy 运行您在切换流量之前,对新版本应用程序进行测试。如果发现问题,您可以快速回滚到旧版本。

此外,您还可以对蓝绿部署模式做更多控制:

  • 您可以选择是手工创建一组新实例,还是完全复制运行中的自动扩展组?
  • 您可以选择何时切换流量?按照什么比例切换流量?
  • 以及在部署完成后,是否删除旧实例?

下面,我们以一个具体示例来演示如何进行蓝绿部署。

第一步:启动部署向导,搭建测试应用。

步骤1:登录 AWS 管理控制台,选择AWS CodeDeploy 服务

步骤2:如果显示介绍页面,请选择 Get Started Now。如果显示 Applications 页面,请在 More info 中,选择 示例部署向导

步骤3:选择 Sample deployment

步骤4:选择 Blue/green deployment

步骤5: Key pair name 根据您账户中的设置选择,其它选项保持默认设置。

点击 Launch environment

此时,CloudFormation会为您创建一个堆栈 – 一个简单的Web网站:由一个ELB和3台Web服务器组成,并配置了自动扩展组。几分钟后,您将会看到Congratulations! Your environment is ready页面。

Sample application 部分,您可以点击http://BlueGreenLoadBalancer-xxx查看Web网站内容(注意背景色是蓝色)

在Sample blue/green deployment部分,记下新版本应用程序的S3地址 https://s3.cn-north-1.amazonaws.com.cn/aws-codedeploy-cn-north-1/samples/latest/SampleApp2_Linux.zip,后续步骤会用到。

第二步:修改部署模式为“蓝绿部署”

步骤1:在CodeDeploy控制台,选择  Applications -> BlueGreenDemoApplication(刚创建的应用程序) -> BlueGreenDemoFleet-xxx(刚创建的部署组)。在 Actions下拉菜单中,选择“Edit

步骤2:在新页面中,将 Deployment Type 设置为 Blue/green deployment,并点击 Save

注:在该页面中,您还可以设置更灵活的部署方式,是否发送通知,如何回滚等。

第三步:部署一个新版本

步骤1:在前一步返回的页面中,依旧选择之前的部署组 BlueGreenDemoFleet-xxx在 Actions下拉菜单中,选择 Deploy New Version

步骤2:在新页面中,在 Revision location* 中,填入之前记录的新版本应用程序所对应的S3地址:https://s3.cn-north-1.amazonaws.com.cn/aws-codedeploy-cn-north-1/samples/latest/SampleApp2_Linux.zip,并点击 Deploy

第四步:观察部署过程和结果

在接下来的页面中,您将会看到整个部署过程:

在EC2控制台,您会看到创建了3个新实例。

部署完毕后,在页面底部您可以看到新创建的3个实例接替了所有流量,原有的3个实例不再接收流量,并被终止。

您也可以随时在控制台的Applications -> Deployments 点击相应的部署ID查看详情。

使用浏览器重新刷新Web页面,背景色已变成绿色。

至此,蓝绿部署完毕。

测试完毕,为避免产生后续费用,请按照以下顺序清除所有资源:

  1. 替换环境的实例所属的 Auto Scaling 组。(删除 AWS CloudFormation 堆栈时,与原始环境中的实例关联的 Auto Scaling 组也将被删除。)
  2. 示例部署向导 创建的用于为蓝/绿部署提供原始环境的 CloudFormation 堆栈。
  3. 示例部署向导 创建的 AWS CodeDeploy 部署组和应用程序。

除了管理AWS 的EC2实例,AWS CodeDeploy还能够管理您本地数据中心的物理服务器和/或其它环境中的虚拟服务器,只需在其上安装相应的Agent即可实现混合云管理和部署。目前支持的操作系统包括:Amazon Linux/RHEL/Ubuntu/Windows。

如要获取更详细的帮助信息,请参考AWS CodeDeploy中文文档:http://docs.amazonaws.cn/codedeploy/latest/userguide/welcome.html

 

作者介绍:

田明晶

AWS解决方案架构师,拥有18年IT、互联网工作经验,曾在中国联通互联网中心、Sun、Oracle等公司担任售后,售前工程师;2014加入AWS,担任云技术支持工程师,现任职解决方案架构师。在存储、数据库方面有多年经验;对大数据、容器和各种前沿技术(深度学习、AI等)有浓厚的兴趣和技术积累。