Как запустить сервер в ASG за LB и развернуть код на нем с помощью облачной информации?
Я пытаюсь создать довольно простую инфраструктуру для сред разработки. Данные ограничения:
- Только один экземпляр ec2, основанный на стандартном linux ec2
- Сервер nginx в контейнере Docker обслуживает healthcheck.html
- Сервер должен быть в группе автомасштабирования
- Доступ из Интернета только через балансировщик нагрузки приложения aws
Это предполагаемая архитектура:
Я получил хороший шаблон облачной информации, который не работает. Сообщение об ошибке:
Received 1 FAILURE signal(s) out of 1. Unable to satisfy 100% MinSuccessfulInstancesPercent requirement
Это, кажется, вызвано циклом зависимости:
... или словами:
Проверка работоспособности целевой группы не пройдена
... потому что контейнер докера nginx не существует
... потому что CodeDeploy не развернул докер-контейнер
... потому что облачные данные думают, ASG еще не готова
... потому что проверка работоспособности целевой группы не удалась
Вопрос: можно ли было разорвать цикл, отключив проверки работоспособности в целевой группе? (Я не нашел такой опции в aws). Какие другие варианты могут помочь?
1 ответ
В вашем шаблоне ASG вы можете установить HealthCheck
собственность на EC2
, Таким образом, он не будет зависеть от проверок состояния ELB и пометит экземпляр как исправный, как только он завершит UserData
скрипт.
TestAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
[...]
HealthCheckType: EC2
Тогда в вашем LaunchConfiguration.UserData
вам нужно отправить сигнал после завершения сценария UserData:
TestLaunchConfig:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
[...]
UserData:
Fn::Base64:
!Sub |
#!/bin/bash -x
[... some setup ...]
# Signal the status from this instance
/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} \
--resource TestAutoScalingGroup --region ${AWS::Region}
Обратите внимание, что --resource
параметр должен соответствовать TestAutoScalingGroup
Название ресурса.
Надеюсь, это поможет:)