1. 简介

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

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

1.1 应用程序(Application)

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

1.1.1 部署组

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

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

1.1.2 代码修订

代码修订,保存了当前应用涉及到得所有代码,代码的存放位置可以在 S3 或 Github。
如果用户自建代码托管,当需要部署时,可以在工作机上同步代码到本地,然后使用 AWS 命令行进行打包上传。

  1. $ aws deploy push --application-name <MyAppName> \
  2. --s3-location s3://<MyBucketName>/<MyNewAppBundleName> \
  3. --source <PathToMyBundle>

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

1.2 部署(Deployment)

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

1.3 部署配置(Deployment Configuration)

部署配置存放了一次部署的服务器台数或百分比,在发起部署时需要指定所需配置。CodeDeploy 默认提供了三种配置:一次部署一台、一次部署一半数量的服务器,以及一次完成全部部署。部署发起后,CodeDeploy 会按照上述策略进行工作,指导完成部署组内全部服务器的更新。AWS CodeDeploy - 图5
如果用户要自定义部署策略,建议使用命令行完成。比如下面的例子创建的配置就是一次完成20%的服务器部署。

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

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

2. 服务器配置

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

2.1 服务器角色

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

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Action": [
  6. "s3:Get*",
  7. "s3:List*"
  8. ],
  9. "Effect": "Allow",
  10. "Resource": "*"
  11. }
  12. ]
  13. }

2.2 Agent 安装

Agent 可以在创建 EC2 时通过 User Data 安装,也可以登录到服务器上安装。
如果使用 User Data 安装,模板如下:

  1. #!/bin/bash
  2. yum -y update
  3. yum install -y ruby
  4. yum install -y aws-cli
  5. cd /home/ec2-user
  6. aws s3 cp s3://bucket-name/latest/install . --region region-name
  7. chmod +x ./install
  8. ./install auto

其中,关于 bucket-name 和 region-name,请查阅下面链接,找到对应 Region 的替换名称。
https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/instances-ec2-create.html

例如,北京 Region 的 User Data 是:

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

如果是选择先创建 EC2 服务器,再安装 Agent,请注意使用 sudo 以 root 权限安装。详情请见:
https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/codedeploy-agent-operations-install.html

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

  1. sudo service codedeploy-agent status

2.3 用户端配置

建议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 文件和一些用于处理安装中一个或多个事件的脚本。
AWS CodeDeploy - 图6

AppSpec.yml 脚本不仅定义了代码部署的路径,而且指定了部署过程中相关事件的处理脚本。部署事件有7个,可以按需选择指定。
AWS CodeDeploy - 图7
用户把代码、AppSpec.yml、事件脚本通过 aws deploy push 命令打包上传后,用户就可以通过 CodeDeploy 图形化平台选择对应的代码修订(Revision)进行部署了。当然,继续使用命令行进行部署,更是高效的方法。
此外,CodeDeploy 还可以和常见的持续集成工具协同工作,如 Jenkins、Travis CI 等。