Вы можете использовать автоматическое масштабирование групповых перехватчиков жизненного цикла , чтобы запретить ASG завершать экземпляр до того, как перехват будет помечен как завершенный.
Вы можете прикрепить перехватчик жизненного цикла завершения к вашей ASG, используяaws_autoscaling_lifecycle_hook
resource :
resource "aws_autoscaling_group" "example" {
availability_zones = ["us-west-2a"]
name = "example"
min_size = 1
max_size = 2
}
resource "aws_autoscaling_lifecycle_hook" "example" {
name = "example"
autoscaling_group_name = "${aws_autoscaling_group.example.name}"
default_result = "CONTINUE"
heartbeat_timeout = 300
lifecycle_transition = "autoscaling:EC2_INSTANCE_TERMINATING"
notification_target_arn = "arn:aws:sqs:us-west-2:444455556666:queue1*"
role_arn = "arn:aws:iam::123456789012:role/S3Access"
}
Приведенный выше пример заставит ASG ждать 5 минут (300 секунд) после того, как экземпляр будет готов к завершению. Как только ловушка жизненного цикла запускается ASG, пытающейся завершить работу экземпляра, он отправляет уведомление на notification_target_arn
, который может быть либо очередью SQS, либо темой SNS.
Затем вам необходимо обработать уведомление. с чем-то, что может выполнять любые действия, которые вы хотите сделать. В вашем случае у вас может быть небольшое приложение, работающее на каждом экземпляре, которое опрашивает очередь SQS, ища уведомление о завершении для своего собственного идентификатора экземпляра, и, если оно получает это уведомление, оно останавливает службу. В качестве альтернативы вы можете задать для темы SNS лямбда-функцию для выполнения какого-либо действия.
После завершения действия вам потребуется пометить хук жизненного цикла как завершенный, вызвав API-интерфейс AWS с соответствующей информацией. Или вы можете подождать тайм-аут и позволить ASG продолжить с завершением в соответствии с параметром default_result
на ресурсе aws_authscaling_lifecycle_hook
.