Estamos usando o Terraform para lançar ASGs para a maioria de nossas instâncias AWS EC2. O problema é que, de vez em quando, queremos fazer algum trabalho extra antes de encerrar uma instância; por exemplo: desativar um nó de um cluster antes que a instância do EC2 em que ele estava sendo executado seja encerrada. Se fôssemos apenas diminuir min
== max
(nosso padrão), uma instância seria encerrada e não poderíamos executar uma desativação normal.
Ao invés disso o que eu tentei é baixar min
para o novo valor desejado (exemplo: 6) e manter o max
valor antigo (exemplo: 10), o que acontece nesse caso é que o desired
valor fica em 10 (o max
) e encerrando o EC2 instância faz com que uma nova seja iniciada pelo ASG. NOTA: não estamos definindo a configuração do Terraform desired_capacity
.
Se eu definir desired_capacity
manualmente, corro o risco de o ASG encerrar um nó que não foi desativado normalmente, então não acho que seja uma opção para mim.
O que eu gostaria idealmente é que o ASG não fizesse nada quando a contagem atual de instâncias do EC2 para esse ASG estivesse entre min
e max
e me permitisse encerrar manualmente as instâncias. Obviamente, se a contagem cair min
, eu ainda gostaria que o ASG lançasse uma nova instância do EC2.
Existe alguma maneira de conseguir isso?
Existem duas maneiras possíveis de alcançar o que você deseja:
Opção 1: Suspender Processos de Auto Scaling
Você pode colocar o processamento do grupo de Auto Scaling "em espera" enquanto faz seus ajustes.
Por exemplo, você pode tentar:
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
Opção 2: usar ganchos de ciclo de vida do Auto Scaling
Usando Lifecycle Hooks, suas instâncias do EC2 iniciadas e/ou encerradas têm a oportunidade de fazer um processamento inicial ou pré-encerramento. Por exemplo, você pode fazer com que o gancho notifique a instância finalizadora de que ela está prestes a ser encerrada e pode se descomissionar de seu cluster.
http://docs.aws.amazon.com/autoscaling/latest/userguide/lifecycle-hooks.html
Supostas soluções:
Opção 1 : Seu ASG deve ser criado com proteção de instância LIGADA - Terraform docs
Nesse caso, poderíamos ter a próxima sequência de operações para a desativação da instância:
aws autoscaling set-instance-protection --instance-ids <instances_ids> --auto-scaling-group-name <asg_name> --no-protected-from-scale-in
Opção 2 : seu ASG não foi criado com proteção de instância.
Nesse caso, poderíamos ter a próxima sequência de operações para a desativação da instância:
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