Есть ли способ создания ловушек AWS для автоматического масштабирования жизненного цикла с CloudFormation без условий гонки?

2

Я пытаюсь использовать AWS автомасштабирование жизненный цикл крючки в шаблоне , который инкапсулирует следующие вещи:

  1. AWS::AutoScaling::AutoScalingGroup с соответствующими политиками увеличения / уменьшения, конфигурацией запуска, ролью IAM и т. д.
  2. 2 из AWS::AutoScaling::LifecycleHookдля EC2 запуска / завершения событий.
  3. AWS::SQS::Queue (в упрощенном примере), где публикуются уведомления о жизненном цикле.
  4. AWS::IAM::Role роль группы автоматического масштабирования для отправки уведомлений в очередь SQS.

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

И вот условие гонки.

AWS::AutoScaling::LifecycleHookссылки на объекты AWS::AutoScaling::AutoScalingGroup(и, следовательно, зависит от него). Это диктует порядок, в котором CloudFormation создает ресурсы (группа создается первой).

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

Есть ли способ обойти это и поймать события запуска во время запуска стека?

Алекс Б
источник
Похоже, отсутствие предвидения на дизайн этого. Лучшая реализация позволила бы хукам жизненного цикла быть частью определения ASG, а не ASG являться свойством хука.
Бретт

Ответы:

4

Это не идеальное решение, но будет ли создание двухпроходного стека правильным решением?

  1. Установите DesiredCapacityсвойство в AutoScalingGroupресурсе на 0при первоначальном создании стека. Это позволяет LaunchConfiguration, AutoScalingGroupи LifecycleHookресурсы должны быть созданы без фактического запуска каких - либо экземпляров.
  2. Установите DesiredCapacityжелаемое количество (> 0) при последующем обновлении стека. Это должно запустить ваши нужные экземпляры после того, LifecycleHookкак был создан.
Уилл Джордан
источник
1

Другой обходной путь - сделать что-то похожее на то, что предлагает Уилл Джордан, но которое может быть частью того же обновления стека CloudFormation:

  1. При первоначальном создании стека установите для свойства DesiredCapacity ресурса AutoScalingGroup значение 0. Это позволяет создавать ресурсы LaunchConfiguration, AutoScalingGroup и LifecycleHook без фактического запуска каких-либо экземпляров.
  2. Создайте AWS :: AutoScaling :: ScheduledAction в зависимости от LifecycleHook с желаемыми размерами и Recurrence, установленными в: * * * * *

Эти ресурсы могут быть частью одного скрипта Cloudformation, и нет необходимости выполнять несколько обновлений в стеке.

[Edit]: К сожалению, этот подход приводит к случаям, когда встречается выражение cron повторения. В группе AutoScaling необходимо установить для IgnoreUnmodifiedGroupSizeProperties значение «true» в AutoScalingScheduledAction группы AutoScaling UpdatePolicy ( https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cribute-httateate-upat запланированные действия ).

aitorpazos
источник
0

Я не уверен, что это сработает, но похоже, что вы сможете получить аналогичный результат, используя NotificationConfigurationресурс ASG.

NotificationConfiguration может отправить уведомление в тему SNS, для которой подписана очередь SQS. Очевидно, что pendingпри таком подходе жизненный цикл будет проходить и не будет ждать complete-lifecycle-action, но по крайней мере все запуски экземпляров будут доступны в очереди.

НТН

редактировать

Другим вариантом может быть использование WaitConditionили CreationPolicy- не уверен, будут ли они применены до обработки ловушек жизненного цикла.

Brett
источник