AWS Auto-scaling Groups 的最佳 DevOps 使用?

Best DevOps use of AWS Auto-scaling Groups?

我一直在为 AWS 上托管的应用程序开发 DevOps 管道。我想改进我当前的设置,但我不确定这样做的最佳方法。我目前的设置如下:

此设置的问题在于,从实例终止到新实例已完全配置,环境一直处于下降状态。

我一直在思考可以改进此过程以消除停机时间的方法,并且我提出了两个可能的解决方案:

解决方案 #1:

使用此解决方案,ASG 中始终至少有一个实例能够处理请求。问题是,ASG 似乎不支持手动调用它来启动新实例的简单操作。 (他们只在扩展策略要求时启动新实例。)您可以将现有实例附加到该组,但这会导致所需的容量值增加,这是我不想要的。

解决方案 #2:

与前面的解决方案一样,始终至少有一个实例可用于处理请求。问题是,通常有两个实例,即使只需要一个实例也是如此。此外,代码部署过程似乎不必要地复杂。

那么哪个更好:解决方案 #1、解决方案 #2,还是我还没有想到的其他解决方案?还有一个简短的免责声明:我知道我将 ASG 用于其预期目的之外的其他用途,但这似乎是按照 AWS "EC2 instances are cattle" 理念实施自动化代码部署的最佳方式。

即使这是一个 DevOps 管道而不是生产环境,您所描述的听起来像是一个 blue/green 部署场景,您希望能够在不停机的情况下在环境之间切换。我认为最好的答案主要是针对您的要求(我们不是 100% 知道),但是像 The DOs and DON'Ts of Blue/Green Deployment 这样的指南将有助于找到实现目标的最佳方法,无论它是 #1, #2,或其他。

您要找的词是"zero-downtime deployment."

The problem is, ASGs don't seem to support a simple operation of manually calling on it to spin up a new instance. (They only launch new instances when the scaling policies call for it.) You can attach existing instances to the group, but this causes the desired capacity value to increase, which I don't want.

如果您自己更改所需的容量(例如通过 API 调用),Auto Scaling 组会自动为您启动一个额外的实例。例如,这是为您的 Auto Scaling 组 (ASG) 实施零停机部署的简单方法:

  1. 运行 弹性负载均衡器 (ELB) 背后的 ASG。
  2. 最初,所需容量为 1,因此您在 ASG 中只有一个 EC2 实例。
  3. 要部署新代码,您首先要使用新代码(例如新 AMI 或新用户数据)创建新的启动配置。
  4. 接下来,您将所需的容量从 1 更改为 2。ASG 将使用新的启动配置自动启动一个新的 EC2 实例。
  5. 一旦新的 EC2 实例启动并 运行 并在您的 ELB 中注册,您将所需的容量从 2 改回 1,ASG 将自动终止旧的 EC2 实例。

您可以手动实施或使用现有工具为您完成,例如:

您可以了解有关 trade-offs between tools like Terraform, CloudFormation, Ansible, Chef, and Puppet here 的更多信息。