在 tomcat7 上的 VPC 私有子网中自动部署战争

PHP*_*ger 5 authentication automated-install amazon-web-services amazon-vpc elastic-beanstalk

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

  • 公共子网包含 myNatingBastion实例
  • 私有子网包含我的应用程序服务器(ec2使用我的项目 war 文件运行 tomcat7 的3 个实例)。这 3 个实例背后是ELB

每当我想更新战争文件时,我都可以通过两种方式进行。

手动的

  1. 我将新的战争文件上传到 S3 存储桶
  2. SSH 到Bastion服务器(只能通过 SSH 连接)
  3. 从这里 SSH 到私有实例
  4. 从S3下载war文件,停止tomcat7替换旧war(并删除目录)
  5. 启动tomcat

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

半手动 这是步骤

  1. 将新战争上传到 S3 存储桶
  2. 杀死一个实例(从 AWS 网站的控制面板)
  3. 缩放和启动配置会自动启动以保持最少的实例数。这将启动一个新实例并执行一个脚本,该脚本实际上从 S3 和其他一些环境设置和文件夹等下载战争。
  4. 当我看到新实例被创建、启动并运行并添加到 ELB 时,我杀死了另一个旧实例。
  5. 这样我一个一个地杀死所有旧实例,然后用最新升级的新实例替换它们。

第一种方法很快,但需要很多手动步骤。SSH 进出实例(实例上的 SSH 仅允许来自 BASTION 服务器)。下载、停止、替换、启动。

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

我想实现以下目标

  1. 自动化升级过程(单击按钮)
  2. 非开发人员(如 QA 和支持人员)无需访问 AWS 网站或 SSH 密钥即可升级
  3. 快速升级
  4. 失败时回滚

有人可能会想为什么我不使用 Beanstalk,它很简单,只需上传新的战争文件,如果出现任何问题,自动升级所有具有回滚功能的实例?

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

  1. 应用整体架构复杂,VPC包含9个子网,私有和公有子网中有大量ec2实例。和使用安全组的复杂安全配置
  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 approch
  6. 我的向外流量是通过NATing服务器,外部世界无法(理论上)知道实例。
  7. 在 beanstalk 实例中可以直接访问。但在我的环境中它不是可能的,你只能SSH BASTION从一个SSH密钥和一些sudo的随机用户名(我认为这是难以猜测),以及私人实例的具体IP实例可以通过BASTION只(自定义安全组SSHed配置)。
  8. 同样,我的 RDS 实例也在我指定的私有子网之一中,只有应用程序的 API 实例才能连接到数据库(告诉你很多自定义配置)。
  9. 还有一些其他的。

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

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

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

小智 0

同样的问题,花了大约两天多的时间后,我意识到有一个名为 Publish artifacts over SSH for jenkins 的插件(如果你有 CI)并做了一些配置更改以允许 NAT 与 jenkins 服务器对话,至少这解决了我。

我确实有相同的设置,作为私有子网中的服务器和公共子网中的 NAT,我从那里通过 ssh 将 war 部署到私有计算机。

希望这可以帮助!