亚马逊AWS官方博客

自动化部署服务——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中国软件开发中心软件工程师,从事企业软件和移动平台的开发工作。