Я пытаюсь настроить непрерывное развертывание для нашей новой среды, в которую мы переходим в моей компании.
Я использую стек облачной информации aws для хранения всей моей инфраструктуры. Когда я создаю стек, мои экземпляры инициализируются правильно через свои AWS::AutoScaling::LaunchConfiguration
настройка и конкретно - AWS::CloudFormation::Init
. (Это в моем шаблоне JSON облачной информации). Этот сценарий запуска config / init вытащит контейнер докеров моего приложения и запустит его на экземплярах ec2 в моем AWS::AutoScaling::AutoScalingGroup
.
Когда я совершаю свое репо, у меня есть .travis-ci.yml
файл настройки для запуска aws update-stack
команда. Это сделает так, что любые новые экземпляры, которые добавляются в мой стек, будут иметь самую новую версию моего докера при запуске сценария инициализации.
Прямо сейчас, как указано в моем вопросе, я получаю ошибку 503. Это происходит в период времени, когда мои старые экземпляры становятся недействительными, а новые экземпляры «нагреваются».
Я бы хотел, чтобы мои новые экземпляры нагрелись и были недоступны, затем, когда они станут теплыми и будут готовы, добавьте их, а затем удалите старые.
Вот что я сейчас делаю, чтобы столкнуться с этой проблемой:
aws cloudformation update-stack \
--stack-name <stack-name> \
--template-body file://<template-file>.json \
--profile <my-profile> \
--parameters <params>
Тогда либо:
# This rans for each INSTANCE_ID in the current stack.
aws autoscaling set-instance-health \
--profile <my-profile> \
--instance-id ${INSTANCE_ID} \
--health-status Unhealthy \
--no-should-respect-grace-period
Или:
aws autoscaling detach-instances \
--auto-scaling-group-name <auto-scaling-group-name> \
--no-should-decrement-desired-capacity \
--profile <my-profile> \
--instance-ids <instance-1> <instance-2>
Приветствуется любое понимание того, как я могу устранить простои при замене экземпляров группы автомасштабирования!
Я также был бы открыт для создания экземпляров и последующего добавления их в группу автомасштабирования через attach-instances
команда. Однако я не знаю, как предоставить этим экземплярам уже существующие AWS::AutoScaling::LaunchConfiguration
и я хочу, чтобы мой процесс был СУХИМ и не повторял эту функцию дважды.
Спасибо за помощь!
Я нашел прямое решение для замены экземпляров EC2 в моей группе автомасштабирования. Прямо из документация по aws:
Политики AutoScalingReplacingUpdate и AutoScalingRollingUpdate применяются только при выполнении одного или нескольких из следующих действий:
Я понял, что самым простым решением для меня было изменить имя группы автомасштабирования примерно на следующее:
"WebServerGroup":{
"Type":"AWS::AutoScaling::AutoScalingGroup",
"Properties":{
"AutoScalingGroupName": {
"Fn::Sub" : "MyWebServerGroup-${UniqueDockerTag}"
},
...
},
"UpdatePolicy":{
"AutoScalingRollingUpdate":{
"MaxBatchSize":"50",
"MinSuccessfulInstancesPercent": 100,
"PauseTime": "PT5M",
"WaitOnResourceSignals": true
},
"AutoScalingReplacingUpdate" : {
"WillReplace" : "true"
}
}
}
В ${UniqueDockerTag}
- это параметр, переданный в мой шаблон, и он уникален для каждой сборки, поэтому для моего варианта использования это было простое и эффективное решение.
Создается новая AutoScalingGroup, и по завершении ее создания старая AutoScalingGroup удаляется. Все это делается с нулевым временем простоя.
Надеюсь это поможет! Ура!
То, что вы пытаетесь сделать, похоже на нечто среднее между скользящим развертыванием и сине-зеленым развертыванием.
На вашем месте я бы рассмотрел несколько других вариантов, прежде чем пытаться исправить вашу конкретную проблему.
Вместо управления группой AutoScaling, в которой каждый экземпляр активно извлекает контейнер, и замены экземпляров EC2 для развертывания новых выпусков вам следует рассмотреть возможность использования кластера ECS и служб ECS.
Кластер ECS - это где вы запускаете свои контейнеры. Кластер ECS также является группой AutoScaling для экземпляров EC2, но вместо того, чтобы активно извлекать образ вашего контейнера, они присоединяются к кластеру ECS и ждут инструкций, что делать.
Вот где на помощь приходят службы ECS - описание службы ECS какие вы хотите запустить, т.е. определение контейнера, параметры и т. д. Затем он планирует контейнеры (задачи ECS) на доступных узлах кластера ECS.
Развернуть новую версию вашего приложения так же просто, как обновить определение службы ECS - это можно сделать как непрерывное обновление, все-в-одном и т. Д. Оно легко интегрируется с ALB, ELB и т. Д., И вы, безусловно, можете достичь нулевого уровня. релизы простоя.
Использование ECS устраняет необходимость заменять экземпляры EC2 при каждом выпуске контейнера и заменяет только сами контейнеры.
Другой вариант - правильное сине-зеленое развертывание, при котором вы создаете полностью новую среду, а затем переключаете трафик, как правило, на уровне DNS.
Это означает, что ваш шаблон CloudFormation для каждого выпуска будет содержать полную инфраструктуру (ASG, LaunchConfig, ALB, ...), и вы получите два экземпляра стека - например, app-blue и app-green. Когда синий активен, вы можете снести и повторно развернуть зеленый. Протестируйте его и, когда будете счастливы, переключите DNS с синего ALB на зеленый ALB. В следующем выпуске вы повторите то же самое для Blue.
Опять же, преимущество этого заключается в том, что у вас есть простой путь отката (просто переключите DNS обратно на синий ALB, если зеленое развертывание окажется прерванным), и опять же, это позволяет без простоев.
Обновить: только что объявлено AWS re: Invent 2018 - Сине-зеленая поддержка развертывания для ECS. Эта новая функция может облегчить вам ECS Service выпускает без необходимости каждый раз создавать полную среду.
Надеюсь, это поможет :)