Синие/зеленые развертывания AWS CloudFormation для EC2

#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 вы можете создать второй стек с новым выпуском, то есть так называемый зеленый стек. Для постепенного высвобождения вы можете:

  1. создайте дополнительный уровень DNS, который позволяет направлять трафик как на синий, так и на зеленый, в определенной пропорции, ИЛИ
  2. дополнительный балансировщик нагрузки перед синими и зелеными стеками.

Примерный случай

Например, предположим, что у вас есть стек с группой автоматического масштабирования (ASG) и балансировщиком нагрузки. DNS-имя вашей службы myservice.com маршруты к эластичному IP-адресу (EIP), подключенному к вашему балансировщику нагрузки. Чтобы развернуть новую версию, вам просто нужно будет изменить идентификатор AMI для вашего ASG.

ВАРИАНТ 1

  1. Создание записи DNS blue.myservice.com и установите EIP текущего стека (так называемый синий) в качестве целевого маршрута к нему.
  2. Создайте второй стек (зеленый стек) с записью DNS green.myservice.com и нацельте его на EIP, созданный с помощью этого нового стека.
  3. Разверните новый выпуск во вновь созданном зеленом стеке, изменив идентификатор AMI.
  4. Теперь измените маршрут для myservice.com и нацелиться на обоих blue.myservice.com и green.myservice.com в пропорциях, которые вы считаете подходящими.
  5. В целях тестирования теперь вы можете настроить таргетинг green.myservice.com напрямую.
  6. Если проверка или тестирование зеленого цвета в порядке, вы можете масштабировать новые экземпляры с помощью ASG и направлять больше трафика в зеленый стек, а также масштабировать синий.
  7. Делайте это, пока весь трафик не перейдет на зеленый.
  8. Теперь вы можете полностью обновить «синий» стек и изменить трафик обратно на него или использовать его в качестве будущего «зеленого» стека, развернув на нем новую версию.

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

ВАРИАНТ 2

  1. Создайте второй «зеленый стек»;
  2. создайте балансировщик нагрузки в качестве дополнительного уровня, который распределяет нагрузку между синим и зеленым, направляя трафик на соответствующие балансировщики нагрузки;
  3. Точка myservice.com к этому новому балансировщику нагрузки;
  4. Масштабируйте/ удаляйте экземпляры по мере изменения трафика.
  5. Вы закончите, когда весь трафик перейдет на зеленый.

ОБЩИЕ СВЕДЕНИЯ В каждом случае вы, скорее всего, захотите параметризовать некоторые значения, чтобы упростить постепенное изменение нагрузки и автоматизировать весь процесс. Чтобы автоматизировать весь процесс развертывания, вы, скорее всего, будете использовать некоторые правила CloudWatch или EventBridge и лямбды, если это необходимо, в основном в зависимости от ваших потребностей и практики. Это не должно быть очень сложно