确保已停止的 ec2 实例池的可用性

Ensure the availability of a pool of stopped ec2 instances

我想维护一个已停止的 Amazon EC2 实例池。每当数量低于阈值时,我希望能够创建新实例,然后在它们达到 运行 后立即停止它们。仅在亚马逊基础设施内这可能吗?

也许我误解了您的 objective...您不能 "ensure availability" 实例不付费。

处于停止状态的实例只是物理上不存在于任何地方的逻辑实体——硬件在启动时分配,在停止时解除分配,在下次启动时重新分配。在不太可能出现的情况下,可用区已用完给定实例 class 的容量,该 class 的已停止实例将不会启动,因为没有可用于部署它们的硬件。

要确保实例始终可用,您必须预留它们,并且必须在特定可用区中指定预留:

Amazon EC2 Reserved Instances provide a significant discount (up to 75%) compared to On-Demand pricing and provide a capacity reservation when used in a specific Availability Zone. [emphasis added]

https://aws.amazon.com/ec2/pricing/reserved-instances/

在大多数计划下,预留实例无论是否 运行 都按相同的费率收费,因此停止它们没有什么意义。

您当然可以创建 Amazon EC2 实例,然后停止它们,以便稍后启动。正如您所指出的,这样做的好处是实例的启动速度比启动新实例的速度快。

没有自动化的方法来帮助解决这个问题。您可能必须编写一个解决方案来执行以下操作:

  • 监控已停止实例数
  • 如果数量低于阈值,启动一个新实例
  • 新实例可以通过用户数据自动停止自身(通过对操作系统的关闭命令,或通过对 EC2 的 StopInstances 调用)

您必须考虑的一些事项:

  • 什么触发监控?会如期进行吗?
  • 启动新实例的任务需要等待 新实例启动并停止,然后再启动更多实例
  • 什么 在需要时启动 实例?
  • 实例是否会在不再需要时停止

更好的选择是使用 Auto Scaling,并根据表明您的队列繁忙的某些指标发出横向扩展警报,并使用缩小警报删除车队不忙时的实例。横向扩展警报可以设置为在超过阈值(例如 80% CPU)后启动实例,这应该允许新实例在事情 100% 忙之前启动。启动新实例和启动现有实例之间的时间差非常小(至少 Linux)。

如果您使用 Windows,启动新实例时的最大时间延迟是由于 Sysprep,这使得 "clean" 机器具有新的唯一 ID。您可以通过在没有 Sysprep 的情况下创建 AMI 来作弊,这样启动速度会更快。