Как я могу предотвратить завершение экземпляра EC2 с помощью автоматического масштабирования?

Я хотел бы предотвратить завершение экземпляра EC2 функцией Auto Scaling, если этот экземпляр находится в середине какой-то обработки.

Фон:
Предположим, у меня есть группа Auto Scaling, в которой в настоящее время работает 5 экземпляров. Я создаю сигнал тревоги при среднем использовании ЦП... Предположим, что 4 экземпляра простаивают, а один выполняет некоторую тяжелую обработку... Средняя загрузка процессора вызовет тревогу, и в результате будет выполнена политика масштабирования.

Как получить автоматическое масштабирование для завершения одного из экземпляров idle, а не того, что находится в середине обработки?

Ответ 1

Update

Как отмеченный Райаном Уоллсом (+1), AWS тем временем предоставляет Защита экземпляра для контроля того, может ли Auto Scaling завершать конкретный экземпляр при масштабировании (см. вводный пост в блоге Защита экземпляра для автоматического масштабирования для ходьбы ):

Вы можете включить параметр защиты экземпляра при автоматическом масштабировании группы или отдельного экземпляра Auto Scaling. При автоматическом масштабировании запускает экземпляр, экземпляр наследует защиту экземпляра настройка группы Auto Scaling. [...]

Стоит отметить, что защита этого экземпляра применяется только к шкале обычного масштабирования шкалы в событиях:

Защита экземпляра не защищает экземпляры Auto Scaling от ручное завершение через консоль Amazon EC2, terminate-examples или API TerminateInstances. Пример защита не защищает экземпляр Auto Scaling от завершения если он не прошел проверку работоспособности и должен быть заменен. Кроме того, экземпляр защита не защищает экземпляры Spot в группе Auto Scaling от прерывания.

Как обычно, эта функция доступна через консоль управления AWS (меню "Действия" - "Защита экземпляра" - "Установить масштаб в защите" )), AWS CLI ( set-instance-protection) и API (SetInstanceProtection действие API).

Последние два варианта позволяют автоматизировать сценарий под рукой, т.е. нужно будет включить защиту экземпляра до запуска заданий "тяжелой обработки" и отключить защиту экземпляра, как только они будут завершены, чтобы экземпляр снова имел право на завершение.


Исходный ответ

Эта функция в настоящее время недоступна для Auto Scaling Amazon EC2 - в то время как вы действительно можете Настроить [] политику завершения экземпляра для вашей группы автоматического масштабирования, доступные политики не включают такую ​​(довольно продвинутую) концепцию:

Автоматическое масштабирование предоставляет для вас следующие параметры политики завершения выбирать из. Вы можете указать один или несколько из этих параметров в своем политика завершения.

  • OldestInstance. Укажите это, если вы хотите, чтобы самый старый экземпляр в вашей группе автоматического масштабирования был завершен. [...]

  • NewestInstance. Укажите это, если вы хотите, чтобы последний запущенный экземпляр был завершен. [...]

  • OldestLaunchConfiguration. Укажите это, если вы хотите, чтобы экземпляр, запущенный с использованием самой старой конфигурации запуска, был прекращается. [...]

  • ClosestToNextInstanceHour. Укажите это, если вы хотите, чтобы экземпляр, ближайший к завершающему счету оплаты, был прекращается. [...]

  • По умолчанию - укажите это, если вы хотите, чтобы Auto Scaling использовал политику завершения по умолчанию для выбора экземпляров для завершения.

Ответ 2

Я только что успешно справился с проблемой долгосрочных заданий в группе автоматического масштабирования, используя относительно недавнюю функцию привязки к жизненному циклу.

Проблема с попыткой выбрать idle node для завершения, в моем случае, заключалась в том, что процесс, который выбирает idle node, будет гоняться против процессов, которые отправляют работу узлам. В этом случае лучше использовать стратегию, в которой любой node может быть прерван, но прекращение происходит изящно, так что никакая работа не будет потеряна. Затем вы можете использовать все стандартные средства политики автоматического масштабирования для управления масштабированием и масштабированием.

Крюк жизненного цикла завершения позволяет пользователю (или процессу) выполнять действия на node после того, как он был помещен в промежуточное состояние (обозначенное Terminating: Wait) группой автоматического масштабирования. Затем пользователь (или процесс) отвечает за завершение действия жизненного цикла посредством вызова API AWS, в результате чего завершается завершение экземпляра EC2.

То, как я это задал, короче:

  • Создайте роль, которая позволяет автоматически масштабировать сообщение в очередь SQS.
  • Создайте очередь SQS для сообщений о завершении.
  • Создайте монитор script, который запускается как служба в каждом node. Мой script - это простой конечный автомат, управляемый событиями, который последовательно переходит из MONITORING (опроса SQS для сообщения о завершении для node) для DRAINING (опроса очереди заданий до тех пор, пока на node не будет выполняться никакая работа) to TERMINATED (вызов полного цикла).
  • Стандартная конфигурация для автоматического масштабирования AWS, управляемого событиями; то есть создания аварийных сигналов CloudWatch и политик автоматического масштабирования для масштабирования и масштабирования.

Одним из препятствий для этого подхода является то, что управление привязкой жизненного цикла еще не поддерживается в SDK (boto, по крайней мере, не поддерживает его AFAIK), и нет ресурсов Cloud Formation для перехватов.дел >

Соответствующая документация AWS находится здесь:

http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html

Ответ 3

Amazon наконец-то решила этот вопрос. Теперь существует "защита экземпляра", где вы можете пометить свой экземпляр как защищенный, и он не будет прерван во время "шкалы в".

См. https://aws.amazon.com/blogs/aws/new-instance-protection-for-auto-scaling

Ответ 4

aws-cli - ваш лучший друг..

Ответ 5

Вы можете использовать Amazon CloudWatch для достижения этой цели: http://aws.typepad.com/aws/2013/01/amazon-cloudwatch-alarm-actions.html. Из статьи:

Вы можете использовать аналогичную стратегию, чтобы избавиться от экземпляров, которым поручено обрабатывать пакетные процессы с интенсивным вычислением. Как только процессор простаивает, и работа завершена, завершите экземпляр и сохраните деньги!

В этом случае, поскольку вы будете обрабатывать завершение, вам нужно будет удалить политику масштабирования. Также см. Другой вариант: fooobar.com/info/445553/....