当新实例动态创建时,如何在 EC2 上部署网页?

当新实例动态创建时,如何在 EC2 上部署网页?

我们有一个网站,其中的页面需要不时更新。该网站随时大约有 8 个 EC2 实例在运行,但偶尔会变得更大。我们使用负载平衡器和自动缩放来创建更多实例。页面只是磁盘上的普通文件;没有内容管理系统。Web 服务器是 Jetty。

如果我修改了一个页面,如何将其部署到所有当前页面以及未来实例?

显然,我不能使用 Fabric 之类的管理工具,因为它不会更新未来实例所基于的 AMI。创建新 AMI 并进行部署也是一个错误,因为首先,这是一个繁琐的过程,其次,它会终止现有实例上的所有当前用户会话。

我认为实例需要从某处提取网站的页面,并时不时地检查更新。

我考虑过将页面放在 S3 上,但是这不可行,因为 1) S3 无法在页面更改时通知实例,2) 因此您必须不断轮询 S3,3) 这很昂贵,并且 4) 您必须对每个页面单独执行此操作。

最简单的方法是什么?如果最好 != 简单,那么最好的方法是什么?

答案1

我认为有以下几种选择:

  1. 使用 S3;我知道您表示这是不可能的,但新服务器必须从某个地方获取代码。假设您的部署已编写脚本以部署到正在运行的实例,请添加一行以推送到 S3。这也可以使用 man 源代码控制工具自动完成。
  2. 创建一个主服务器,所有其他服务器都可以通过 ssh 轮询代码。
  3. 从 github 等代码托管服务中拉取

答案2

您可以通过在自动缩放中使用一些克隆后步骤来实现这一点。具体方法取决于您的舒适度,但这样的解决方案可能会为您带来很多帮助:

  • 在类似 git 的程序中构建您的 web 目录。
  • 在 AMI 中,构建一个 cron 任务来按照计划从 repo 服务器进行 git-pull。
  • 在 AMI 中,构建 git-pull 作为启动任务的一部分。

这是一种批处理模式。现有服务器不会收到新文件的通知,但由于 cron 执行时间,它们都会在大约同一时间收到通知。新服务器将在启动时收到新文件。

这里的关键是将您的内容与 AMI 本身分离。

相关内容