#amazon-web-services #amazon-ec2 #build #amazon-cloudformation #devops
Вопрос:
Поддерживает ли AWS CloudFormation синие/зеленые развертывания для EC2? Я смог создать развертывание синего/зеленого цвета с помощью CodeDeploy для EC2; однако я не смог понять, как создать его с помощью CloudFormation. Похоже, что CloudFormation поддерживает развертывание синего/зеленого цвета для ECS (https://aws.amazon.com/about-aws/whats-new/2020/05/aws-cloudformation-now-supports-blue-green-deployments-for-amazon-ecs/) и лямбда-функции.
Раздел CodeDeploy шаблона выглядит следующим образом:
Type: AWS::CodeDeploy::DeploymentGroup
Properties:
DeploymentGroupName: 'SampleGroupName'
ServiceRoleArn: !Sub 'arn:aws:iam::${AWS::AccountId}:role/AzureDevOps/CodeDeployOperations'
ApplicationName: !Ref CodeDeployApplication
AutoScalingGroups:
- !Ref SampleASG
DeploymentStyle:
DeploymentType: BLUE_GREEN
DeploymentOption: WITH_TRAFFIC_CONTROL
BlueGreenDeploymentConfiguration:
TerminateBlueInstancesOnDeploymentSuccess:
Action: TERMINATE
TerminationWaitTimeInMinutes: 5
DeploymentReadyOption:
ActionOnTimeout: CONTINUE_DEPLOYMENT
GreenFleetProvisioningOption:
Action: COPY_AUTO_SCALING_GROUP
DeploymentConfigName: !If [IsProdStaging, CodeDeployDefault.HalfAtATime, CodeDeployDefault.AllAtOnce]
LoadBalancerInfo:
TargetGroupInfoList:
- Name: !GetAtt SampleTargetGroup.TargetGroupName
AutoRollbackConfiguration:
Enabled: true
Events:
- DEPLOYMENT_FAILURE
Комментарии:
1. Что такое ваш шаблон CloudFormation и почему он не работает?
2. Спасибо @Marcin Я обновил описание, включив раздел Codedeploy шаблона CF. По-видимому, проблема связана с автоматическим масштабированием.
3. Вы должны точно объяснить, что не так с вашим кодом? Какие-нибудь сообщения об ошибках?
4. @Marcin Я обратился в службу поддержки AWS, и оказалось, что AWS Cloudformation в настоящее время не поддерживает развертывание синего/зеленого для EC2. Спасибо вам за вашу помощь.
5. @pimir спасибо, я целую вечность искал решение этой проблемы, прежде чем нашел это. Вы нашли какой-либо обходной путь или просто установили шаблон на место, а затем вручную изменили его на сине-зеленый в консоли?
Ответ №1:
На данный момент (октябрь 2021 года) AWS по-прежнему не поддерживает развертывание синего/зеленого цвета через CloudFormation, если вы используете EC2. В DeploymentStyle
разделе документов есть синяя заметка, гласящая:
Для голубых/зеленых развертываний AWS CloudFormation поддерживает развертывания только на лямбда-вычислительных платформах. Вы можете выполнять развертывания Amazon ECS blue/green с помощью AWS::CodeDeploy::BlueGreen hook.
Это очень расстраивает, что это недоступно, так как нет хороших обходных путей.
Ответ №2:
На самом деле есть обходной путь, который должен быть довольно простым, если вы используете CloudFormation для настройки EC2 с необходимой информацией. С помощью CloudFormation вы можете создать второй стек с новым выпуском, то есть так называемый зеленый стек. Для постепенного высвобождения вы можете:
- создайте дополнительный уровень DNS, который позволяет направлять трафик как на синий, так и на зеленый, в определенной пропорции, ИЛИ
- дополнительный балансировщик нагрузки перед синими и зелеными стеками.
Примерный случай
Например, предположим, что у вас есть стек с группой автоматического масштабирования (ASG) и балансировщиком нагрузки. DNS-имя вашей службы myservice.com маршруты к эластичному IP-адресу (EIP), подключенному к вашему балансировщику нагрузки. Чтобы развернуть новую версию, вам просто нужно будет изменить идентификатор AMI для вашего ASG.
ВАРИАНТ 1
- Создание записи DNS blue.myservice.com и установите EIP текущего стека (так называемый синий) в качестве целевого маршрута к нему.
- Создайте второй стек (зеленый стек) с записью DNS green.myservice.com и нацельте его на EIP, созданный с помощью этого нового стека.
- Разверните новый выпуск во вновь созданном зеленом стеке, изменив идентификатор AMI.
- Теперь измените маршрут для myservice.com и нацелиться на обоих blue.myservice.com и green.myservice.com в пропорциях, которые вы считаете подходящими.
- В целях тестирования теперь вы можете настроить таргетинг green.myservice.com напрямую.
- Если проверка или тестирование зеленого цвета в порядке, вы можете масштабировать новые экземпляры с помощью ASG и направлять больше трафика в зеленый стек, а также масштабировать синий.
- Делайте это, пока весь трафик не перейдет на зеленый.
- Теперь вы можете полностью обновить «синий» стек и изменить трафик обратно на него или использовать его в качестве будущего «зеленого» стека, развернув на нем новую версию.
Конечно, это решение может вызвать множество проблем и не является сине-зеленым в том смысле, что кэш DNS вызовет сбои на период проверки кэша, даже если новый сломанный выпуск был снят. Таким образом, я думаю, что использование балансировщика нагрузки является лучшим решением.
ВАРИАНТ 2
- Создайте второй «зеленый стек»;
- создайте балансировщик нагрузки в качестве дополнительного уровня, который распределяет нагрузку между синим и зеленым, направляя трафик на соответствующие балансировщики нагрузки;
- Точка myservice.com к этому новому балансировщику нагрузки;
- Масштабируйте/ удаляйте экземпляры по мере изменения трафика.
- Вы закончите, когда весь трафик перейдет на зеленый.
ОБЩИЕ СВЕДЕНИЯ В каждом случае вы, скорее всего, захотите параметризовать некоторые значения, чтобы упростить постепенное изменение нагрузки и автоматизировать весь процесс. Чтобы автоматизировать весь процесс развертывания, вы, скорее всего, будете использовать некоторые правила CloudWatch или EventBridge и лямбды, если это необходимо, в основном в зависимости от ваших потребностей и практики. Это не должно быть очень сложно