Назад | Перейти на главную страницу

Создавать новые экземпляры Aws :: AutoScalingGroup до того, как старые будут уничтожены. (Ошибка 503)

TL; DR: см. Редактирование внизу.

Я пытаюсь настроить непрерывное развертывание для нашей новой среды, в которую мы переходим в моей компании.

Я использую стек облачной информации 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 удаляется. Все это делается с нулевым временем простоя.

Надеюсь это поможет! Ура!

То, что вы пытаетесь сделать, похоже на нечто среднее между скользящим развертыванием и сине-зеленым развертыванием.

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

1. Используйте кластер ECS (или EKS).

Вместо управления группой AutoScaling, в которой каждый экземпляр активно извлекает контейнер, и замены экземпляров EC2 для развертывания новых выпусков вам следует рассмотреть возможность использования кластера ECS и служб ECS.

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

Вот где на помощь приходят службы ECS - описание службы ECS какие вы хотите запустить, т.е. определение контейнера, параметры и т. д. Затем он планирует контейнеры (задачи ECS) на доступных узлах кластера ECS.

Развернуть новую версию вашего приложения так же просто, как обновить определение службы ECS - это можно сделать как непрерывное обновление, все-в-одном и т. Д. Оно легко интегрируется с ALB, ELB и т. Д., И вы, безусловно, можете достичь нулевого уровня. релизы простоя.

Использование ECS устраняет необходимость заменять экземпляры EC2 при каждом выпуске контейнера и заменяет только сами контейнеры.

2. Правильное сине-зеленое развертывание

Другой вариант - правильное сине-зеленое развертывание, при котором вы создаете полностью новую среду, а затем переключаете трафик, как правило, на уровне DNS.

Это означает, что ваш шаблон CloudFormation для каждого выпуска будет содержать полную инфраструктуру (ASG, LaunchConfig, ALB, ...), и вы получите два экземпляра стека - например, app-blue и app-green. Когда синий активен, вы можете снести и повторно развернуть зеленый. Протестируйте его и, когда будете счастливы, переключите DNS с синего ALB на зеленый ALB. В следующем выпуске вы повторите то же самое для Blue.

Опять же, преимущество этого заключается в том, что у вас есть простой путь отката (просто переключите DNS обратно на синий ALB, если зеленое развертывание окажется прерванным), и опять же, это позволяет без простоев.


Обновить: только что объявлено AWS re: Invent 2018 - Сине-зеленая поддержка развертывания для ECS. Эта новая функция может облегчить вам ECS Service выпускает без необходимости каждый раз создавать полную среду.


Надеюсь, это поможет :)