Назад | Перейти на главную страницу

Terraform ожидает удаления ASG при плавном завершении работы инстансов EC2

Я использую Terraform для настройки ASG для моих рабочих серверов, на которых работает sidekiq. При развертывании, когда AMI image_id изменяется, экземплярам требуется длительное плавное завершение работы перед завершением для завершения обработки задания (макс. 30 м).

Моя идея заключается в следующем:

  1. Использовать автомасштабирование модуль с хуком начального жизненного цикла, который устанавливает переходное состояние в autoscaling:EC2_INSTANCE_TERMINATING при удалении старой ASG и создании новой ASG при развертывании.

  2. Отправить состояние перехода в очередь SQS.

  3. Настройте функцию AWS Lambda, которая получает сообщения о состоянии от SQS, отправляет удаленную команду с SSM, чтобы инициировать плавное завершение работы на экземпляре EC2. Скрипт корректного завершения работы, запущенный на экземпляре, отправит SIGTERM в sidekiq, отслеживает завершение работы sidekiq и затем отправляет shutdown -h now команда в конце, чтобы остановить экземпляр.

  4. Лямбда немедленно завершает работу и не дожидается завершения сценария выключения, который ожидался. Он отправляет уведомление SNS об успехе или неудаче. Теперь проблема в том, что Terraform ожидает успешного удаления ASG и достигает тайм-аута, который по умолчанию составляет 10 минут. Я хотел бы заставить Terraform продолжить работу после того, как ASG выбрана для удаления, не дожидаясь ее завершения.

у меня есть force_delete=true и wait_for_capacity_timeout=0 параметры настроены.

Из документов:

force_delete - (Необязательно) позволяет удалить группу автомасштабирования, не дожидаясь завершения всех экземпляров в пуле. Вы можете принудительно удалить группу автомасштабирования, даже если она находится в процессе масштабирования ресурса. Обычно Terraform осушает все экземпляры перед удалением группы. Это обходит такое поведение и потенциально оставляет ресурсы висящими.

Terraform существует через 10 минут со следующим сообщением об ошибке:

Error: Error deleting autoscaling group: Auto Scaling Group still exists

Почему не работает? Вы думаете, что это ошибка?

Я думаю, проблема в том, что ASG не удалит себя до тех пор, пока не будут удалены все экземпляры, и не дождется завершения работы хуков.

Мысли: 1) Если вам не нужен механизм очередей SQS для чего-то, обычно легче запустить лямбду через событие CW

2) При отправке команды shutdown -h вы также можете захотеть, чтобы она отправляла команду для завершения перехвата жизненного цикла, чтобы вам не приходилось ждать, пока перехватчик истечет тайм-аут для ASG, чтобы закончить действие масштабирования. https://docs.aws.amazon.com/cli/latest/reference/autoscaling/complete-lifecycle-action.html

3) Параметр, который вы изменяете, предназначен для запуска экземпляров, в документации указано: «Максимальное время, в течение которого Terraform должен ожидать восстановления работоспособности экземпляров ASG до истечения времени ожидания». Что подразумевает его только для запуска https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html

4) Попробуйте изменить тайм-аут удаления: https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#delete