Ответ 1
Во-первых, из нашего опыта использования CloudFormation ASG HealthCheckType и HealthCheckGracePeriod используются в основном вне сферы событий CloudFormation. Эти свойства вступают в игру в любое время, когда в ASG добавляется новый экземпляр. Это может быть во время обновления CloudFormation, но также во время событий Auto Scaling или во время события самовосстановления. В последнем случае важно установить для параметра HealthCheckGracePeriod значение, которое дает новому экземпляру достаточное время для выхода в Интернет, прежде чем рассматривать проверки работоспособности ELB.
Похоже, вам больше всего интересна функция UpdatePolicy, которая вызывается при запуске обновления CloudFormation с измененной конфигурацией запуска. Свойством magic является WaitOnResourceSignals, который заставляет ASG ждать сигнала успеха, прежде чем считать обновление успешным.
"UpdatePolicy" : {
"AutoScalingRollingUpdate" : {
"MinInstancesInService" : "1",
"MaxBatchSize" : "1",
"PauseTime" : "PT15M",
"WaitOnResourceSignals" : "true"
}
},
Если для свойства WaitOnResourceSignals установлено значение true, свойство PauseTime становится таймаутом. Если ASG не получает сигнал в течение PauseTime в течение 15 минут, обновление считается сбоем, а новый экземпляр прекращается. Как только ASG получает сигнал успеха, проверяется проверка работоспособности ASG, если срок действия HealthCheckGracePeriod еще не истек. Обычно мы устанавливаем значение параметра HealthCheckGracePeriod равным значению PauseTime. Это гарантирует, что мы никогда не начнем использовать проверку работоспособности ELB, прежде чем экземпляр сможет отправить сигнал или достигнуть таймаута PauseTime. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html
Как правило, сигнал успешности отправляется в ASG после начальной загрузки cfn-init script из пользовательских данных конфигурации запуска ASG.
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -xe\n",
"yum update -y aws-cfn-bootstrap\n",
"/opt/aws/bin/cfn-init -v ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource LaunchConfig ",
" --configsets full_install ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"/opt/aws/bin/cfn-signal -e $? ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource WebServerGroup ",
" --region ", { "Ref" : "AWS::Region" }, "\n"
]]}}
Этого достаточно для многих случаев, но иногда экземпляр может быть еще не готов, когда мы отправляем сигнал успеха в ASG. Например, мы можем подождать в фоновом процессе для загрузки данных или дождаться запуска нашего сервера приложений. Это особенно актуально, если наша проверка работоспособности ELB нацелена на URL-адрес, который требует, чтобы наше приложение работало. В этих случаях мы хотим отложить сигнал успеха до тех пор, пока наш экземпляр не будет готов. Вот пример того, как создать конфигурационный конфигуратор Launch Configuration для задержки сигнала до тех пор, пока ELB API не вернет статус "InService" для экземпляра.
"verify_instance_health" : {
"commands" : {
"ELBHealthCheck" : {
"command" : { "Fn::Join" : ["", [
"until [ \"$state\" == \"\\\"InService\\\"\" ]; do ",
" state=$(aws --region ", { "Ref" : "AWS::Region" }, " elb describe-instance-health ",
" --load-balancer-name ", { "Ref" : "ElasticLoadBalancer" },
" --instances $(curl -s http://169.254.169.254/latest/meta-data/instance-id) ",
" --query InstanceStates[0].State); ",
" sleep 10; ",
"done"
]]}
}
}
}
Смотрите этот дискуссионный форум для получения дополнительной информации и полного примера, используя проверку работоспособности ELB - https://forums.aws.amazon.com/ann.jspa?annID=2741
Примечание. Эти примеры также требуют, чтобы вы использовали атрибут ASG CreationPolicy для приема сигналов во время создания ASG. В прошлом ресурсы WaitCondition и WaitConditionHandle использовались для приема сигналов, но они больше не рекомендуются. Атрибут Count - это количество сигналов, которые должны быть получены при создании. Это значение должно быть равно ASG MinSize.
"CreationPolicy" : {
"ResourceSignal" : {
"Timeout" : "PT15M",
"Count" : "2"
}
},
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html