我们正在使用 Terraform 为我们的大多数 AWS EC2 实例启动 ASG。问题是有时我们想在终止实例之前做一些额外的工作。例如:在节点运行的 EC2 实例终止之前从集群中停用节点。如果我们只是降低min
== max
(我们的默认值),那么实例将被终止,我们无法运行优雅的退役。
相反,我尝试的是降低min
到新的期望值(例如:6)并将 保持max
在旧值(例如:10),在这种情况下发生的情况是该desired
值保持在 10(the max
)并终止 EC2实例会导致 ASG 启动一个新实例。注意:我们根本没有设置 Terraform desired_capacity
设置。
如果我desired_capacity
手动设置,我会冒 ASG 终止尚未正常退役的节点的风险,所以我认为这不是我的选择。
我最希望的是,当 ASG 的当前 EC2 实例计数介于两者之间时,ASG 什么也不做min
,max
让我手动终止实例。显然,如果计数低于min
我仍然希望 ASG 启动一个新的 EC2 实例。
有什么办法可以做到这一点?
有两种可能的方法来实现你想要的:
选项 1:暂停 Auto Scaling 进程
您可以在进行调整时将 Auto Scaling 组的处理“暂停”。
例如,您可以尝试:
aws autoscaling suspend-processes --auto-scaling-group-name MyGroup
aws autoscaling resume-processes --auto-scaling-group-name MyGroup
http://docs.aws.amazon.com/cli/latest/reference/autoscaling/suspend-processes.html
选项 2:使用 Auto Scaling 生命周期挂钩
使用 Lifecycle Hooks,您启动和/或终止的 EC2 实例有机会进行初始或终止前处理。例如,您可以让钩子通知终止实例它即将终止,并且它可以将自己从集群中退役。
http://docs.aws.amazon.com/autoscaling/latest/userguide/lifecycle-hooks.html
假设解决方案:
选项 1:您的 ASG 应在实例保护开启的情况下创建- Terraform 文档
在这种情况下,我们可以进行下一个操作序列,例如停用:
aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling-group-name <asg_name> --no-protected-from-scale-in
选项 2:您的 ASG不是使用实例保护创建的。
在这种情况下,我们可以进行下一个操作序列,例如停用:
aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling-group-name <asg_name> --protected-from-scale-in
aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling- group-name <asg_name> --no-protected-from-scale-in