当实例数在最小值和最大值之间时,如何使AWS ASG不执行任何操作

我们使用Terraform为大多数AWS EC2实例启动ASG。 问题是,偶尔我们想在终止一个实例之前做一些额外的工作; 例如:在集群运行的EC2实例终止之前,从集群中解散节点。 如果我们只是为了降低min == max (我们的默认值),那么一个实例被终止,我们不能运行一个优雅的退役。

相反,我试图将min降到新的期望值(例如:6),并将max保持在旧值(例如10),在这种情况下会发生什么情况是desired值保持在10( max )终止EC2实例导致ASG启动新的实例。 注意:我们没有设置Terraform desired_capacity设置。

如果手动设置desired_capacity ,我冒ASG终止一个尚未正常退役的节点,所以我不认为这是我的select。

我理想的情况是当ASG的当前EC2实例计数在minmax之间并让我手动终止实例时,ASG不做任何事情。 显然,如果计数低于min我仍然希望ASG启动一个新的EC2实例。

有没有办法做到这一点?

假设的解决scheme:

选项1 :您的ASG应创build实例保护打开 – Terraform文档

在这种情况下,我们可以有下一个操作序列,例如:

  1. 执行特定实例的解除(从其中删除数据)
  2. 通过理想的价值减lessASG的规模
  3. 应用Terraform状态
  4. 从停用的实例中删除保护标志: aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling-group-name <asg_name> --no-protected-from-scale-in

选项2 :您的ASG 创build实例保护。

在这种情况下,我们可以有下一个操作序列,例如:

  1. 在ASG的所有实例上添加保护标志: aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling-group-name <asg_name> --protected-from-scale-in
  2. 执行特定实例的解除(从其中删除数据)
  3. 通过理想的价值减lessASG的规模
  4. 应用Terraform状态
  5. 从停用的实例中删除保护标志: aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling- group-name <asg_name> --no-protected-from-scale-in
  6. (可选)等到ASG缩小到所需的大小并从其他实例中删除保护标志

有两种可能的方法来实现你想要的:

选项1:暂停Auto Scaling进程

您可以在进行调整时将Auto Scaling组的处理置于“保持”状态。

例如,你可以尝试:

  1. 暂停Auto Scaling处理: aws autoscaling suspend-processes --auto-scaling-group-name MyGroup
  2. 停用并终止您的EC2实例,
  3. 手动调整所需的计数,
  4. 恢复Auto Scaling处理: aws autoscaling resume-processes --auto-scaling-group-name MyGroup

http://docs.aws.amazon.com/cli/latest/reference/autoscaling/suspend-processes.html

选项2:使用Auto Scaling生命周期钩子

使用生命周期挂钩,您启动和/或终止的EC2实例有机会进行初始化或预先终止处理。 例如,您可以让挂钩通知终止的即将终止,它可以从您的群集退役。

http://docs.aws.amazon.com/autoscaling/latest/userguide/lifecycle-hooks.html