最佳DevOps使用AWS自动扩展组?

时间:2016-09-28 21:37:41

标签: amazon-web-services continuous-deployment devops autoscaling

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

  • ELB背后的ASG
  • 所需容量:1
  • 最小容量:1
  • 最大容量:1
  • 代码部署过程:
    1. 将可部署移至S3
    2. 终止ASG中的实例
    3. 自动配置新实例
    4. 新实例可以在用户数据中进行部署

此设置的问题是环境从实例终止时到完全配置新实例时都已关闭。

我一直在考虑如何改进此流程以消除停机时间,并且我提出了两种可能的解决方案:

解决方案#1:

  • ELB背后的ASG
  • 所需容量:1
  • 最小容量:1
  • 最大容量:2
  • 代码部署过程:
    1. 将可部署移至S3
    2. 将新实例发布到ASG
    3. 新实例可以在用户数据中进行部署
    4. 使用旧的可部署
    5. 终止实例

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

解决方案#2:

  • ELB背后的ASG
  • 所需容量:2
  • 最小容量:2
  • 最大容量:2
  • 代码部署过程:
    1. 将可部署移至S3
    2. 终止instance-A
    3. 自动配置新实例-A
    4. instance-A按用户数据脚本拉下新的可部署脚本
    5. 终止instance-B
    6. 自动配置新实例-B
    7. instance-B按用户数据脚本拉下新的可部署脚本

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

哪个更好:解决方案#1,解决方案#2,还是我还没有想到的其他解决方案?另外一个快速免责声明:我理解我正在使用ASG而不是其预期目的,但它似乎是在AWS的“EC2实例是牛”理念下实现自动代码部署的最佳方式。

2 个答案:

答案 0 :(得分:2)

您正在寻找的术语是“零停机部署”。

  

问题是,ASG似乎不支持手动调用它来启动新实例的简单操作。 (它们仅在扩展策略调用它时才启动新实例。)您可以将现有实例附加到组,但这会导致所需的容量值增加,这是我不想要的。

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

  1. 在Elastic Load Balancer(ELB)后面运行ASG。
  2. 最初,所需的容量为1,因此您在ASG中只有一个EC2实例。
  3. 要部署新代码,首先要使用新代码(例如新AMI或新用户数据)创建新的启动配置。
  4. 接下来,您将所需容量从1更改为2.ASG将使用新的启动配置自动启动新的EC2实例。
  5. 新的EC2实例启动并运行并在ELB中注册后,您将所需的容量从2更改回1,ASG将自动终止旧的EC2实例。
  6. 您可以手动实现此功能,也可以使用现有工具为您执行此操作,例如:

    您可以详细了解trade-offs between tools like Terraform, CloudFormation, Ansible, Chef, and Puppet here

答案 1 :(得分:0)

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