Я пытаюсь использовать AWS автомасштабирование жизненный цикл крючки в шаблоне , который инкапсулирует следующие вещи:
AWS::AutoScaling::AutoScalingGroup
с соответствующими политиками увеличения / уменьшения, конфигурацией запуска, ролью IAM и т. д.- 2 из
AWS::AutoScaling::LifecycleHook
для EC2 запуска / завершения событий. AWS::SQS::Queue
(в упрощенном примере), где публикуются уведомления о жизненном цикле.AWS::IAM::Role
роль группы автоматического масштабирования для отправки уведомлений в очередь SQS.
Когда запускается ASG, очередь заканчивается двумя тестовыми уведомлениями о создании ловушек жизненного цикла, но без уведомлений о запуске экземпляра.
И вот условие гонки.
AWS::AutoScaling::LifecycleHook
ссылки на объекты AWS::AutoScaling::AutoScalingGroup
(и, следовательно, зависит от него). Это диктует порядок, в котором CloudFormation создает ресурсы (группа создается первой).
Проблема в том, что группа начинает запускать экземпляры до завершения создания ловушки (запуск экземпляра не является частью шаблона, поэтому он начинает выполняться параллельно). К тому времени, когда ловушка создана, больше нет событий для публикации, так как экземпляры уже были созданы.
Есть ли способ обойти это и поймать события запуска во время запуска стека?
Ответы:
Это не идеальное решение, но будет ли создание двухпроходного стека правильным решением?
DesiredCapacity
свойство вAutoScalingGroup
ресурсе на0
при первоначальном создании стека. Это позволяетLaunchConfiguration
,AutoScalingGroup
иLifecycleHook
ресурсы должны быть созданы без фактического запуска каких - либо экземпляров.DesiredCapacity
желаемое количество (>0
) при последующем обновлении стека. Это должно запустить ваши нужные экземпляры после того,LifecycleHook
как был создан.источник
Другой обходной путь - сделать что-то похожее на то, что предлагает Уилл Джордан, но которое может быть частью того же обновления стека CloudFormation:
* * * * *
Эти ресурсы могут быть частью одного скрипта Cloudformation, и нет необходимости выполнять несколько обновлений в стеке.
[Edit]: К сожалению, этот подход приводит к случаям, когда встречается выражение cron повторения. В группе AutoScaling необходимо установить для IgnoreUnmodifiedGroupSizeProperties значение «true» в AutoScalingScheduledAction группы AutoScaling UpdatePolicy ( https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cribute-httateate-upat запланированные действия ).
источник
Я не уверен, что это сработает, но похоже, что вы сможете получить аналогичный результат, используя
NotificationConfiguration
ресурс ASG.NotificationConfiguration может отправить уведомление в тему SNS, для которой подписана очередь SQS. Очевидно, что
pending
при таком подходе жизненный цикл будет проходить и не будет ждатьcomplete-lifecycle-action
, но по крайней мере все запуски экземпляров будут доступны в очереди.НТН
редактировать
Другим вариантом может быть использование
WaitCondition
илиCreationPolicy
- не уверен, будут ли они применены до обработки ловушек жизненного цикла.источник