自动缩放 EC2:在启动实例上启动网络服务器

Autoscaling EC2: Launch Webserver on Spun-up Instance

我似乎不明白 AWS Autoscaling 的一个中心点:

我为安装了我的网络服务器的 (Ubuntu) EC2 实例创建了一个 AMI,我将此 AMI 用作我的 Autoscaling 组的启动配置。

但是当 Autoscaling 决定启动一个新实例时,我应该如何在该实例上启动我的网络服务器。我是否应该编写一些启动脚本或从 Autoscaling 启动新启动实例的最佳实践是什么?

当我将应用程序(PostgreSQL、Elasticsearch 等)部署到 EC2 实例时,我通常这样做是为了能够重复该过程。所以我的第一步是创建一个初始部署脚本,它将尽可能多地完成安装和设置过程,而不需要知道 IP 地址、主机名、内存量、处理器数量等。基本上,尽可能多我可以不需要知道任何可以从一个实例更改为下一个实例或在关闭/重新启动时更改的内容。

一旦稳定,我就创建它的 AMI。

然后我创建一个我在启动配置中使用的初始化脚本,并让它在之前创建的 AMI 上执行该脚本。

这适用于高度配置的应用程序。如果您只是使用默认设置(例如 IP 地址 = 0.0.0.0),那么我会简单地设置 'sudo update-rc.d <> defaults 95 10',以便它在启动时运行。

然后创建 AMI。当您从该 AMI 创建新实例时,网络服务器应默认启动。如果没有,我会看看你是否真的设置了 init.d 脚本来这样做。

从 AMI 启动新实例应该与启动之前关闭的实例没有什么不同。

顺便说一下,作为创建这些脚本时的练习,我还做了一些事情来使我的事情变得更清晰:

1) 在单独的 bash 脚本中创建模块(例如创建用户帐户、设置环境变量等)以实现可重复性

2) 每个部署脚本都从下载和安装 AWS CLI 开始

3) 每个 EC2 实例都使用具有 S3 读取访问权限、IAM SSH 描述权限、EC2 地址 allocation/association 等的 IAM 角色启动

4) 将所有脚本加载到 S3 上,然后让部署/初始化脚本下载必要的 bash 模块脚本,chmod +x 并执行它们。它非常接近 OOP,我可以在不过分的情况下获得它,但它创建了非常干净的 bash 脚本。大多数情况下,顶级启动/初始化脚本只是从 S3 下载单个脚本并执行它们。

5) 我采购所有模块而不是简单地执行它们。这样 bash 共享变量。

6) 使 linux 帐户创建成为初始化脚本(不是 AMI)的一部分。使用 CLI,您可以查询用户,grep 获取他们从 AWS 请求的 public SSH 密钥,创建他们的帐户并准备好让他们自动登录。

这样,当您需要更改某些内容(即更改应用程序的版本、更改配置等)时,您只需修改模块脚本,如果它更改了 AMI,则重新启动并重新启动 AMI .否则,如果它只是更改特定实例,而不是仅使用新的初始化脚本启动 AMI。

希望对您有所帮助...