我们正在使用 Terraform 为大多数 AWS EC2 实例启动 ASG。问题是,我们有时想在终止实例之前做一些额外的工作;例如:在终止运行该节点的 EC2 实例之前,从集群中退役该节点。如果我们只是降低min
== max
(我们的默认值),那么实例就会被终止,我们无法运行正常退役。
相反,我尝试降低min
到新的期望值(例如:6)并将保持max
为旧值(例如:10),在这种情况下发生的情况是该desired
值保持在 10( )并且终止 EC2 实例会导致 ASG 启动一个新实例。注意:我们根本max
没有设置 Terraform 设置。desired_capacity
如果我desired_capacity
手动设置,则 ASG 可能会终止尚未正常退役的节点,因此我认为这对我来说不是一个选择。
我理想情况下希望 ASG 当前 EC2 实例数量介于和之间时不执行任何操作min
,max
并允许我手动终止实例。显然,如果数量低于这个数字,min
我仍然希望 ASG 启动一个新的 EC2 实例。
有什么方法可以实现这个吗?
答案1
假定的解决方案:
选项1:您的 ASG 应使用实例保护功能进行创建在-Terraform 文档
在这种情况下,我们可以进行下一步操作,例如退役:
- 执行特定实例的退役(从中删除数据)
- 减少数数ASG 规模与期望值之比
- 应用 Terraform 状态
- 从已退役的实例中删除保护标志:
aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling-group-name <asg_name> --no-protected-from-scale-in
选项 2:你的 ASG 是不是使用实例保护创建。
在这种情况下,我们可以进行下一步操作,例如退役:
- 在 ASG 的所有实例上添加保护标志:
aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling-group-name <asg_name> --protected-from-scale-in
- 执行特定实例的退役(从中删除数据)
- 减少数数ASG 规模与期望值之比
- 应用 Terraform 状态
- 从已退役的实例中删除保护标志:
aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling- group-name <asg_name> --no-protected-from-scale-in
- (可选)等待 ASG 缩小到所需大小并从其他实例中删除保护标志
答案2
有两种可能的方法可以实现你想要的:
选项1:暂停自动扩展流程
您可以在进行调整时将 Auto Scaling 组的处理“暂停”。
例如,您可以尝试:
- 暂停自动缩放处理:
aws autoscaling suspend-processes --auto-scaling-group-name MyGroup
- 退役并终止您的 EC2 实例,
- 手动调整所需数量,
- 恢复自动扩展处理:
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