我有一个公共和私有子网的VPC
。
- 公有子网包含我的
Nating
和Bastion
实例
- 私有子网包含我的应用程序服务器(运行tomcat7的3个
ec2
实例和我的项目战争文件)。 这三个实例都是ELB
每当我想更新战争文件,我可以用两种方法做到这一点。
手册
- 我上传新的战争文件到S3桶
- SSH到
Bastion
服务器(只有这个可以SSH)
- 从这里SSH到私有实例
- 从S3下载war文件,停止tomcat7replace旧的war(并删除目录)
- 启动tomcat
我重复上述步骤为每个实例(目前3个实例)
半手动这是步骤
- 上传新的战争到S3桶
- 杀死一个实例(从AWS网站的控制面板)
- 缩放和启动configuration会自动启动以保持最小实例数量。 这启动一个新的实例,执行一个脚本,实际上从S3下载战争和其他一些环境设置和文件夹等
- 当我看到新的实例被创build,启动并运行,并添加到ELB,我杀死了另一个旧的实例。
- 这样我就一个接一个地杀死了所有旧的实例,并用最新升级的新实例replace掉了。
第一种方法很快,但很多手动步骤。 SSH进出的实例(实例上的SSH只允许从BASTION服务器)。 下载,停止,replace,启动。
第二种方法很慢,而不是实际上自动的。 旧实例终止时间+新实例启动时间+部署新战争
我想实现以下的事情
- 自动升级过程(点击button)
- 非开发人员像QA和支持人员可以升级而无需访问AWS网站或SSH密钥
- 快速升级
- 在发生故障的情况下回滚
有人可能会想,为什么我不使用Beanstalk,它简单,只是上传新的战争文件,自动升级所有与回滚function的实例,如果有什么问题?
这是我的原因(有些事情可能只是我的假设或缺乏知识)。
- 该应用程序的总体架构非常复杂 ,VPC包含9个子网,以及私有和公有子网中的大量ec2实例。 以及使用安全组的复杂安全configuration
- 我自己的子网(Public_Subnet_A,Public_Subnet_B,Private_WEB_A,Private_WEB_B,Private_API_A,SG_GLOBAL,SG_BASTION,SG_BASTION等)的命名约定 。 我在ElasticBeanstalk中看不到这样做。
- Beanstalk仅支持预定义环境的有限预定义模板 。 就像我想要基于Ubuntu的实例一样,使用Tomcat7,运行Java6或7以及其他几个。
- Beanstalk for Java应用程序运行tomcat8,amazon-instance,它也将tomcat保留在Apache之后(我认为桥接是通过
mode_jk
完成的),然后这个Apache在ELB之后。 而我认为ELB-> Apache-mode_jk-> tomcat的东西有点矫枉过正(我错了)。
- 我正在使用ELB-> tomcat进行
- 我的外部stream量是通过NATing服务器,外部世界没有办法(理论上)知道实例。
- 在beanstalk实例中可以直接访问。 但在我的环境中,它是不可能的,你只能使用ssh-key和一些sudo-random用户名(特别是我很难猜到)从特定IP地址ssh BASTION实例,私有实例只能通过BASTION进行SSH(自定义安全组组态)。
- 同样,我的RDS实例也在我指定的专用子网之一中,只有应用程序的API实例可以连接到数据库(告诉你很多自定义configuration)。
- 还有一些其他的。
现在你知道背景。 让我们坚持我在顶部解释的例子的简单版本。
我希望升级是快速和自动的,也不要使用第三方工具与这些工具共享我的凭据(我听说过一些基于云的工具,可以为您提供透明度,并在您select的云环境中执行所有任务) 。
唯一我能想到的就是编写一个ANT脚本或一些Java代码,它们可以执行第一种方法中解释的所有步骤。 虽然不知道他们会被允许执行这些操作的Aws。
同样的问题,花了大约两天以上之后,我意识到有一个名为Publish artifacts的插件,用于jenkins(如果你有CI),并做了一些configuration更改以允许NAT与jenkins服务器交谈,至less这样做的好处是我。
我有相同的设置,作为私人子网和公共子网中的NAT服务器,从我ssh部署战争的私人机器。
希望这可以帮助!