在tomcat7的VPC私有子网中自动部署war部署

我有一个公共和私有子网的VPC

  • 公有子网包含我的NatingBastion实例
  • 私有子网包含我的应用程序服务器(运行tomcat7的3个ec2实例和我的项目战争文件)。 这三个实例都是ELB

每当我想更新战争文件,我可以用两种方法做到这一点。

手册

  1. 我上传新的战争文件到S3桶
  2. SSH到Bastion服务器(只有这个可以SSH)
  3. 从这里SSH到私有实例
  4. 从S3下载war文件,停止tomcat7replace旧的war(并删除目录)
  5. 启动tomcat

我重复上述步骤为每个实例(目前3个实例)

半手动这是步骤

  1. 上传新的战争到S3桶
  2. 杀死一个实例(从AWS网站的控制面板)
  3. 缩放和启动configuration会自动启动以保持最小实例数量。 这启动一个新的实例,执行一个脚本,实际上从S3下载战争和其他一些环境设置和文件夹等
  4. 当我看到新的实例被创build,启动并运行,并添加到ELB,我杀死了另一个旧的实例。
  5. 这样我就一个接一个地杀死了所有旧的实例,并用最新升级的新实例replace掉了。

第一种方法很快,但很多手动步骤。 SSH进出的实例(实例上的SSH只允许从BASTION服务器)。 下载,停止,replace,启动。

第二种方法很慢,而不是实际上自动的。 旧实例终止时间+新实例启动时间+部署新战争

我想实现以下的事情

  1. 自动升级过程(点击button)
  2. 非开发人员像QA和支持人员可以升级而无需访问AWS网站或SSH密钥
  3. 快速升级
  4. 在发生故障的情况下回滚

有人可能会想,为什么我不使用Beanstalk,它简单,只是上传新的战争文件,自动升级所有与回滚function的实例,如果有什么问题?

这是我的原因(有些事情可能只是我的假设或缺乏知识)。

  1. 该应用程序的总体架构非常复杂 ,VPC包含9个子网,以及私有和公有子网中的大量ec2实例。 以及使用安全组的复杂安全configuration
  2. 我自己的子网(Public_Subnet_A,Public_Subnet_B,Private_WEB_A,Private_WEB_B,Private_API_A,SG_GLOBAL,SG_BASTION,SG_BASTION等)的命名约定 。 我在ElasticBeanstalk中看不到这样做。
  3. Beanstalk仅支持预定义环境的有限预定义模板 。 就像我想要基于Ubuntu的实例一样,使用Tomcat7,运行Java6或7以及其他几个。
  4. Beanstalk for Java应用程序运行tomcat8,amazon-instance,它也将tomcat保留在Apache之后(我认为桥接是通过mode_jk完成的),然后这个Apache在ELB之后。 而我认为ELB-> Apache-mode_jk-> tomcat的东西有点矫枉过正(我错了)。
  5. 我正在使用ELB-> tomcat进行
  6. 我的外部stream量是通过NATing服务器,外部世界没有办法(理论上)知道实例。
  7. 在beanstalk实例中可以直接访问。 但在我的环境中,它是不可能的,你只能使用ssh-key和一些sudo-random用户名(特别是我很难猜到)从特定IP地址ssh BASTION实例,私有实例只能通过BASTION进行SSH(自定义安全组组态)。
  8. 同样,我的RDS实例也在我指定的专用子网之一中,只有应用程序的API实例可以连接到数据库(告诉你很多自定义configuration)。
  9. 还有一些其他的。

现在你知道背景。 让我们坚持我在顶部解释的例子的简单版本。

我希望升级是快速和自动的,也不要使用第三方工具与这些工具共享我的凭据(我听说过一些基于云的工具,可以为您提供透明度,并在您select的云环境中执行所有任务) 。

唯一我能想到的就是编写一个ANT脚本或一些Java代码,它们可以执行第一种方法中解释的所有步骤。 虽然不知道他们会被允许执行这些操作的Aws。

同样的问题,花了大约两天以上之后,我意识到有一个名为Publish artifacts的插件,用于jenkins(如果你有CI),并做了一些configuration更改以允许NAT与jenkins服务器交谈,至less这样做的好处是我。

我有相同的设置,作为私人子网和公共子网中的NAT服务器,从我ssh部署战争的私人机器。

希望这可以帮助!