通过EC2进行类似Heroku的部署和环境配置

通过EC2进行类似Heroku的部署和环境配置,heroku,deployment,amazon-web-services,configuration,amazon-ec2,Heroku,Deployment,Amazon Web Services,Configuration,Amazon Ec2,我真的很喜欢应用程序的方法,当你将应用程序部署到Heroku时,你会被迫使用这种方法。对于这个问题,我特别感兴趣的是为配置设置环境变量,就像在Heroku上一样 据我所知,在EC2控制台中无法更改一个或多个实例的环境(尽管在使用elastic beanstalk时似乎可以设置5个环境变量)。因此,我对基于Ubuntu的系统的下一个赌注是使用/etc/environment,/etc/profile,~/.profile,或者只使用export命令来设置环境变量 这是正确的方法还是我遗漏了什么 如

我真的很喜欢应用程序的方法,当你将应用程序部署到Heroku时,你会被迫使用这种方法。对于这个问题,我特别感兴趣的是为配置设置环境变量,就像在Heroku上一样

据我所知,在EC2控制台中无法更改一个或多个实例的环境(尽管在使用elastic beanstalk时似乎可以设置5个环境变量)。因此,我对基于Ubuntu的系统的下一个赌注是使用
/etc/environment
/etc/profile
~/.profile
,或者只使用
export
命令来设置环境变量

这是正确的方法还是我遗漏了什么

如果是的话,有没有关于如何做到这一点的最佳实践?我想我可以使用类似于或的东西,从AWS api获取服务器列表,连接到所有服务器并更改所提到的文件/call
export
。虽然12factor是众所周知的,但我找不到任何博客文章描述如何处理EC2上大量实例的ENV。我不想实施这样的事情,如果有人已经做得很好,而我只是错过了一些东西

注意:我想要一个不使用elastic beanstalk的解决方案,我不关心git push部署或任何其他类似Heroku的功能,这只与应用程序配置有关


任何提示,谢谢

如果您不需要beanstalk,可以查看AWS Opsworks()。非常适合Web worker类型的部署场景。您可以在这里从代码外部传递任何变量(即使是Chef Recipes)

好问题。有许多方法可以实现部署/环境设置

要记住的一件事是,使用Heroku(或者弹性豆茎),您只需推送代码。他们的服务负责可伸缩性因素和跨他们的基础架构复制您的服务(一旦您推送代码)。 如果您使用的是fabric(或capistrano),那么您也在使用推送模型,但是您必须考虑应用程序的所有可伸缩性/复制/容错性

话虽如此,在我看来,如果您使用EC2,最好利用AMI、Autoscale和Cloudformation进行部署。这就是弹性和虚拟化的美妙之处,因为您可以认为资源是短暂的。您仍然可以使用fabric/capistrano自动化AMI构建(我使用Ansible)并配置环境变量、包等。然后您可以定义一个Cloudformation堆栈(带有JSON文件),并在其中添加一个带有预烘焙AMI的自动缩放组

部署应用程序的另一种方法是简单地使用AWS Opsworks服务。它非常全面,有很多选择,但可能不适合所有人,因为有些人可能需要更多的灵活性

如果你想“拉”模型,你可以使用木偶,厨师或CFEngine。在这种情况下,您在云中某处有一个主策略服务器(Puppetmaster、Chef服务器或策略服务器)。当服务器启动时,一个代理(Puppet代理、Chef客户端、Cfengine代理)连接到它的主服务器以获取它的策略,然后执行它。策略可能包含应用程序运行所需的所有包和环境变量。同样,这是一种不同的模式。这个模型可以很好地扩展,但它取决于主机可以处理多少个代理,以及如何错开从代理到主机的连接。如果您想扩展到数千台服务器,也可以负载平衡多个主机,或者只需使用多个主机即可。根据经验,如果你想要一些真正“快速”的Cfengine工作得非常好,这里有一个比较Puppet和Cfengine速度的好博客:

您还可以使用fabric、Ansible、Capistrano等工具完全“推送”。但是,您受到单个服务器(或笔记本电脑)能够处理其试图推送到的数千台服务器的多个连接的限制。这也受到网络带宽的限制,但您可以发挥创意,错开推送更新,或者使用多台服务器推送。同样的,它是工作的,它是一个不同的模型,所以它取决于你想去哪个方向


希望这能有所帮助。

可能已经晚了,但他们知道我们在做什么

我们有一个python脚本,它将Json中的env var作为post数据发送到另一个python脚本,该脚本将这些var转换为ymal文件

之后,我们使用Jenkins pipline groovy使用多分支。Jenkins完成所有构建,然后代码部署将这些环境变量复制到自动缩放中运行的ec2实例。
当然,我们正在做一些从yaml到简单文本文件的操作,以便代码部署可以将其粘贴到/etc/envoirments上

有趣的答案,谢谢。它实际上并没有回答我的问题,但也许我的问题是错的。根据您的回答,尝试将类似Heroku的基于环境的设置引入EC2似乎没有意义。也许使用Opsworks之类的工具并在其中完全处理配置确实更有意义。我只是非常痴迷于在任何git repo中都没有像数据库URL那样的配置数据,就像Heroku一样。但毕竟,将配置从应用程序中分离(12factor)也可能意味着配置存在于它自己的repo中……好吧,如果您想要更大的灵活性,并且愿意花费时间和资源复制Heroku/Elastic Beanstalk类型的设置,这是有意义的。您可以使用许多工具来实现这一点,例如,
fabric
就是其中之一。如果您没有足够的资源和时间,Opsworks可以帮助您更快地到达目的地(也许灵活性会稍低一些)。您刚刚发现了这篇文章,通过google查找这篇文章的人可能会感兴趣:。