写点什么

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

  • 2019-11-15
  • 本文字数:3091 字

    阅读完需:约 10 分钟

自动化部署服务——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 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/getting-started-with-codedeploy/


2019-11-15 08:001213

评论

发布
暂无评论
发现更多内容

LeetCode题解:77. 组合,递归回溯,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

架构训练营 - 第7周课后作业 - 学习总结

Pudding

接口测试如何在post请求中传递文件

测试人生路

接口测试

阿里云官方推出操作系统“等保合规”镜像 -- Alibaba Cloud Linux 等保2.0三级版

阿里云基础软件团队

内核

Apache DolphinScheduler 是如何走进Apache的

代立冬

大数据 数据湖调度 DolphinScheduler Apache DolphinScheduler

mongodb 源码实现系列 - 网络传输层模块实现三

杨亚洲(专注MongoDB及高性能中间件)

MySQL mongodb 分布式 高性能 分布式数据库mongodb

“开源软件供应链点亮计划-暑期2020”公布结果 基于ChubaoFS开发的项目获得最佳质量奖

京东科技开发者

大数据 开源 云原生

会展云技术解读 | 面对突发事故,APP如何做好崩溃分析与性能监控?

京东科技开发者

云计算 云服务

如何实现后台管理系统的权限路由和权限菜单

徐小夕

Java 大前端 编辑器 H5 数据可视化

【运维思考】如何做好云上运维服务?

嘉为蓝鲸

云计算 运维 数字化转型 数据中心 云服务

《Python:Python编程简介:计算机编程和机器学习入门指南》

计算机与AI

Python

简析低代码开发与传统开发的区别与优势

Marilyn

敏捷开发 低代码

嗯,查询滑动窗口最大值的这4种方法不错...

王磊

Java 数据结构和算法

技术分享:WebAssembly能否重新定义前端开发模式?

葡萄城技术团队

webassembly

浅谈API网关(API Gateway)如何承载API经济生态链

华为云开发者联盟

API 网关

终于啃完了这份Java核心原理+框架“面试圣经”,成功五面上岸美团

Java架构追梦

Java 架构 面试 微服务 框架开发

DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座

华章IT

数据库 postgresql

【云小课】版本管理发展史之Git+——代码托管

华为云开发者联盟

git 代码管理 托管

揭秘在召唤师峡谷中移动路径选择逻辑?

华为云开发者联盟

算法 地图 最短路径

帮助企业摆脱困境,名企归乡工程师:能成功全靠有它!

Philips

敏捷开发

架构师训练营 - 第 7 周课后作业(1 期)

Pudding

天啦撸!打印日志竟然只晓得 Log4j?

沉默王二

Java 日志 log4j

重磅解读:K8s Cluster Autoscaler模块及对应华为云插件Deep Dive

华为云开发者联盟

容器 k8s 服务

医疗界“最强大脑”落户杭州!阿里巴巴联合浙大一院共同打造

互联网

移动安全加固助力 App 实现全面、有效的安全防护

蚂蚁集团移动开发平台 mPaaS

安全攻防 App风险 mPaaS

谈谈敏捷开发概念和迭代开发方案

Learun

敏捷开发

分库分表的 9种分布式主键ID 生成方案,挺全乎的

程序员小富

分库分表 Java 分布式

go-zero如何追踪你的请求链路

万俊峰Kevin

Trace microservice Go 语言

【涂鸦物联网足迹】API及SDK介绍

IoT云工坊

软件开发 物联网 API sdk 云平台

解决大中型浏览器(Chrome)插件开发痛点:自定义热更新方案——2.基于双缓存更新功能模块

梁龙先森

Java chrome 大前端 浏览器 技术方案

每周一看:16份文档资料,程序员软硬实力全概览,总有一个适合你

小Q

Java 学习 程序员 架构 面试

自动化部署服务——AWS CodeDeploy 快速入门_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章