在aws

时间:2018-01-18 18:23:12

标签: django amazon-web-services jenkins deployment continuous-integration

我使用的是免费的分层aws帐户,其中我有一台ec2机器(Linux)。我有一个简单的网站,后端服务器在8000端口的django上运行,前端服务器以角度编写并在http(80)端口上运行。我使用nginx进行https并将调用重定向到后端和前端服务器。

现在对于后端构建系统,我做了这三个主要步骤(我通过在同一台机器上运行jenkins自动化)。

1) git pull (Pull the latest code from repo).
2) Do migrations (Updating my db with any new table).
3) Restarting the django server. (I was using gunicorn).

现在,我使用自动扩展组将前端和后端服务器拆分为2台不同的计算机,现在我使用ELB(Aws Elastic Load balancer)来路由请求。我完成了设置。但是现在我在持续部署方面遇到了问题。主要的是ELB使用自动缩放组,而后者又使用AMI。

现在,由于AMI是一次创建的,我的第一个问题是如何自动执行此过程并在已运行的aws服务器中部署我的最新代码。

其次,如果我想为所有服务器只运行一次步骤,比如我用新表更新db的第二步,那么如何实现。

如果这些步骤需要在一台机器上运行,那么第三,我是否需要另一个ec2实例来自动创建AMI,用它更新自动缩放组,然后在其中部署最新代码。

所以,基本上我想知道人们在自动扩展组在AMI的帮助下创建的aws机器中部署最新代码时所遵循的最佳实践。我也使用bitbucket进行代码管理。

1 个答案:

答案 0 :(得分:1)

第一个问题:如何自动化基于包的部署'。

不是为每个版本创建新的AMI,而是创建一个基线AMI,仅在新版本需要操作系统更改/安全补丁等时更改。查看packer等工具以自动创建AMI。为了在代码部署发生变化时自动化代码部署,您可以使用基于包的部署方法,这意味着您为每个版本创建一个包(应该是您的CI过程的一部分),该包存储在某些存储库(如Nexus)中, Artifactory,甚至是一个简单的S3桶。 当您部署应用程序的新实例时,它应该运行某种脚本来在该实例上提取和解包/安装该包<这是基本概念,有许多工具可以帮助您实现这一目标,例如,Chef或AWS CloudFormation。 基本上,第1步应该提取代码,创建包并将其存储在应用程序服务器可用的某个存储库中。这可以离线完成。

第二个问题:如何运行其他任务,例如更新数据库架构。

如上所述,这也可能是您部署的一部分'自动化,所以如果你使用Chef甚至是一个简单的bash脚本,它可以在解压缩新代码之前更新数据库模式,这实际上取决于你的数据库,你如何管理它,以及谁来协调部署。

例如,您可以拥有一个Jenkins作业,该作业会在您推出版本时提取新架构并更新数据库。

您的第三个问题可以通过Packer解决,它可以启动实例,创建AMI并终止实例。

详细了解CICD和CICD相关工具。