Durchführen von blauen/grünen ECS-Bereitstellungen über CodeDeploy mithilfe von AWS CloudFormation - AWS CloudFormation

Durchführen von blauen/grünen ECS-Bereitstellungen über CodeDeploy mithilfe von AWS CloudFormation

Sie können CloudFormation verwenden, um ECS-Blau/Grün-Bereitstellungen über AWS CodeDeploy durchzuführen. Blau/Grün-Bereitstellungen sind eine sichere Bereitstellungsstrategie, die von CodeDeploy bereitgestellt wird, um Unterbrechungen zu minimieren, die durch Änderungen der Anwendungsversionen verursacht werden. Dies wird erreicht, indem Sie Ihre neue Anwendungsumgebung, die als grün, bezeichnet wird, zusammen mit Ihrer aktuellen Anwendung erstellen, die Ihren Live-Datenverkehr bedient und als blau bezeichnet wird. Dies ermöglicht eine gewisse Zeit für die Überwachung und das Testen der grünen Umgebung, bevor Ihr Live-Datenverkehr von blau nach grün geleitet wird und anschließend die blauen Ressourcen deaktiviert werden.

Wenn Sie CloudFormation zum Ausführen von ECS-Blau/Grün-Bereitstellungen verwenden, erstellen Sie zunächst eine Stack-Vorlage, die die Ressourcen für Ihre blauen und grünen Anwendungsumgebungen definiert, einschließlich der zu verwendenden Datenverkehrsweiterleitungs- und Stabilisierungseinstellungen. Als Nächstes erstellen Sie einen Stack aus dieser Vorlage. Dadurch wird Ihre blaue (aktuelle) Anwendung generiert. CloudFormation erstellt nur die blauen Ressourcen während der Stack-Erstellung. Ressourcen für eine grüne Bereitstellung werden erst erstellt, wenn sie erforderlich sind.

Wenn Sie bei einem zukünftigen Stack-Update die Aufgabendefinition oder die Aufgabensatzressourcen in Ihrer blauen Anwendung aktualisieren, führt CloudFormation Folgendes aus:

  • Generiert alle notwendigen Ressourcen für eine grüne Anwendungsumgebung.

  • Verschiebt den Datenverkehr basierend auf den angegebenen Datenverkehrs-Weiterleitungsparametern.

  • Löscht die blauen Ressourcen.

Wenn zu einem beliebigen Zeitpunkt ein Fehler auftritt, bevor die grüne Bereitstellung erfolgreich und abgeschlossen ist, führt CloudFormation den Stack in seinen Zustand zurück, bevor die gesamte grüne Bereitstellung initiiert wurde.

Damit CloudFormation Blau/Grün-Bereitstellungen auf einem Stack durchführen kann, fügen Sie die folgenden Informationen in die Stack-Vorlage ein:

  • Ein Transform-Abschnitt in Ihrer Vorlage, der die Transformation AWS::CodeDeployBlueGreen aufruft, sowie ein Hook-Abschnitt, der den Hook AWS::CodeDeploy::BlueGreen aufruft.

  • Mindestens eine der ECS-Ressourcen, die eine Blau/Grün-Bereitstellung auslösen wird, wenn sie während einer Stack-Aktualisierung ersetzt wird. Derzeit sind diese Ressourcen AWS::ECS::TaskDefinition und AWS::ECS::TaskSet.

Wenn Sie dann eine Stack-Aktualisierung initiieren, bei der alle Eigenschaften der obengenannten Ressourcen aktualisiert werden, für die CloudFormation die Ressourcen ersetzen muss, führt CloudFormation wie oben beschrieben eine Blau/Grün-Bereitstellung durch. Weitere Informationen zum Verhalten der Ressourcenaktualisierung finden Sie unter Aktualisierungsverhalten von Stack-Ressourcen.

In einigen Fällen möchten Sie Ihre Stack-Vorlage so einrichten, dass Blau/Grün-Bereitstellungen aktiviert werden, bevor Sie den Stack erstellen. Sie können jedoch auch die Möglichkeit hinzufügen, dass CloudFormation Blau/Grün-Bereitstellungen für einen vorhandenen Stack durchführt. Fügen Sie dazu die erforderlichen Informationen zur vorhandenen Vorlage des Stacks hinzu.

Darüber hinaus wird empfohlen, dass CloudFormation einen Änderungssatz für die grüne Bereitstellung generiert, bevor die Stack-Aktualisierung gestartet wird. Auf diese Weise können Sie die tatsächlichen Änderungen überprüfen, die am Stack vorgenommen werden.

Modellierung Ihrer Blau/Grün-Bereitstellung mithilfe von CloudFormation-Ressourcen

Um ECS-Blau/Grün-Bereitstellungen mithilfe von CodeDeploy über CloudFormation durchzuführen, muss Ihre Vorlage die Ressourcen enthalten, die Ihre Bereitstellung modellieren, z. B. einen Amazon ECS-Service und Load Balancer. Weitere Informationen dazu, was diese Ressourcen darstellen, finden Sie unter Vor einer Amazon ECS-Bereitstellung im AWS CodeDeploy-Benutzerhandbuch.

Anforderung Ressource Erforderlich/optional Löst die Blau/Grün-Bereitstellung aus, wenn sie ersetzt wird
Amazon ECS-Cluster AWS::ECS::Cluster Optional. Der Standard-Cluster kann verwendet werden. Nein
Amazon ECS-Service AWS::ECS::Service Erforderlich. Nein
Application oder Network Load Balancer AWS::ECS::Service LoadBalancer Erforderlich. Nein
Produktions-Listener AWS::ElasticLoadBalancingV2::Listener Erforderlich. Nein
Listener testen AWS::ElasticLoadBalancingV2::Listener Optional. Nein
Zwei Zielgruppen AWS::ElasticLoadBalancingV2::TargetGroup Erforderlich. Nein
Amazon ECS-Aufgabendefinition AWS::ECS::TaskDefinition Erforderlich. Ja
Container für Ihre Amazon ECS-Anwendung AWS::ECS::TaskDefinition ContainerDefinition Name Erforderlich. Nein
Ein Port für den Ersatzaufgabensatz AWS::ECS::TaskDefinition PortMapping ContainerPort Erforderlich. Nein

Ressourcenaktualisierungen, die grüne Bereitstellungen auslösen

Wenn Sie eine Stack-Aktualisierung durchführen, die eine Eigenschaft aktualisiert, die Ersatz für die folgenden ECS-Ressourcen erfordert, initiiert CloudFormation eine grüne Bereitstellung:

Durch das Aktualisieren von Eigenschaften in diesen Ressourcen, für die keine Ressourcenersetzung erforderlich ist, wird keine grüne Bereitstellung ausgelöst.

Sie können keine Aktualisierungen für die obengenannten Ressourcen mit Aktualisierungen für andere Ressourcen in derselben Stack-Aktualisierung einschließen. Wenn Sie Ressourcen in der obigen Liste sowie andere Ressourcen im selben Stack aktualisieren müssen, führen Sie einen der folgenden Schritte aus:

  • Führen Sie zwei separate Stack-Aktualisierungsvorgänge durch: einen, die nur die Aktualisierungen der obengenannten Ressourcen enthält, und eine separate Stack-Aktualisierung, die Änderungen an anderen Ressourcen enthält.

  • Entfernen Sie die Abschnitte Hook und Transform aus Ihrer Vorlage und führen Sie dann die Stack-Aktualisierung durch. In diesem Fall wird CloudFormation keine grüne Bereitstellung durchführen.

Überlegungen bei der Verwaltung von ECS-Blau/Grün-Bereitstellungen mit CloudFormation

Sie sollten Folgendes berücksichtigen, wenn Sie Ihre Blau/Grün-Bereitstellung mit CloudFormation definieren:

  • Nur Updates für bestimmte Ressourcen lösen eine grüne Bereitstellung aus, wie unter Ressourcenaktualisierungen, die ECS-Blau/Grün-Bereitstellungen auslösen beschrieben.

  • Sie können keine Aktualisierungen für Ressourcen, die grüne Bereitstellungen und Aktualisierungen für andere Ressourcen initiieren, in der gleichen Stack-Aktualisierung einschließen, wie unter Ressourcenaktualisierungen, die ECS-Blau/Grün-Bereitstellungen auslösen beschrieben.

  • Sie können nur einen einzelnen ECS-Service als Bereitstellungsziel angeben.

  • Parameter, deren Werte von CloudFormation verschleiert werden, können nicht während einer Grün-Bereitstellung vom CodeDeploy-Dienst aktualisiert werden und führen zu einem Fehler sowie einer fehlgeschlagenen Stack-Aktualisierung. Dazu zählen:

  • Um eine noch laufende grüne Bereitstellung abzubrechen, brechen Sie die Stack-Aktualisierung in CloudFormation ab, nicht in CodeDeploy oder ECS ab. Weitere Informationen finden Sie unter Stornieren einer Stack-Aktualisierung. (Nach Abschluss einer Aktualisierung können Sie diese nicht mehr stornieren. Sie können einen Stack jedoch mit früheren Einstellungen erneut aktualisieren.)

  • Das Deklarieren von Ausgabewerten oder das Importieren von Werten aus anderen Stacks wird derzeit nicht für Vorlagen unterstützt, die Blau/Grün-ECS-Bereitstellungen definieren.

  • Das Importieren vorhandener Ressourcen wird derzeit nicht für Vorlagen unterstützt, die Blau/Grün-ECS-Bereitstellungen definieren.

  • Sie können den Hook AWS::CodeDeploy::BlueGreen nicht in einer Vorlage verwenden, die verschachtelte Stack-Ressourcen enthält.

  • Sie können den Hook AWS::CodeDeploy::BlueGreen nicht in einem verschachtelten Stack verwenden.

Weitere Informationen dazu, wie sich die Verwendung von CloudFormation zur Durchführung Ihrer ECS-Blau/Grün-Bereitstellungen über CodeDeploy von einer standardmäßigen Amazon ECS-Bereitstellung mit nur CodeDeploy unterscheidet, finden Sie unter Unterschiede zwischen Amazon ECS-Blau/Grün-Bereitstellungen über CloudFormation und Amazon-ECS-Standardbereitstellungen im AWS CodeDeploy-Benutzerhandbuch.

Vorbereiten der Vorlage für die Durchführung von ECS-Blau/Grün-Bereitstellungen

Um Blau/Grün-Bereitstellungen auf Ihrem Stack zu aktivieren, fügen Sie die folgenden Abschnitte in Ihre Stack-Vorlage ein, bevor Sie eine Stack-Aktualisierung durchführen.

  • Fügen Sie Ihrer Vorlage einen Verweis auf die Transformation AWS::CodeDeployBlueGreen hinzu:

    "Transform": [ "AWS::CodeDeployBlueGreen" ],
  • Fügen Sie einen Hook-Abschnitt hinzu, der den Hook AWS::CodeDeploy::BlueGreen aufruft und die Eigenschaften für Ihre Bereitstellung angibt. Verwenden Sie die Vorlagenreferenz unten als Leitfaden.

  • Definieren Sie im Abschnitt Resources die blauen und grünen Ressourcen für Ihre Bereitstellung.

Sie können diese Abschnitte hinzufügen, wenn Sie die Vorlage zum ersten Mal erstellen (d. h. vor dem Erstellen des Stacks selbst), oder Sie können sie einer vorhandenen Vorlage hinzufügen, bevor Sie eine Stack-Aktualisierung durchführen. Wenn Sie die Blau/Grün-Bereitstellung für einen neuen Stack angeben, erstellt CloudFormation nur die blauen Ressourcen während der Stack-Erstellung –— Ressourcen für die grüne Bereitstellung werden erst erstellt, wenn Sie während einer Stack-Aktualisierung erforderlich sind.

Überprüfen der Änderungssätze für Ihre Blau/Grün-Bereitstellung

Es wird dringend empfohlen, einen Änderungssatz zu erstellen, bevor Sie eine Stack-Aktualisierung durchführen, die eine Grün-Bereitstellung initiiert. Auf diese Weise können Sie die tatsächlichen Änderungen sehen, die vor der Stack-Aktualisierung an Ihrem Stack vorgenommen werden. Beachten Sie, dass Ressourcenänderungen möglicherweise nicht in der Reihenfolge aufgeführt werden, in der sie während der Stack-Aktualisierung durchgeführt werden. Weitere Informationen finden Sie unter Aktualisieren von Stacks mithilfe von Änderungssätzen.

Anzeigen von Stack-Ereignissen für Ihre Blau/Grün-Bereitstellung

Sie können die Stack-Ereignisse, die bei jedem Schritt der ECS-Bereitstellung generiert wurden, in der Registerkarte Ereignisse der Seite Stack und mithilfe der AWS CLI anzeigen. Weitere Informationen finden Sie unter Überwachen des Fortschritts einer Stack-Aktualisierung.

Vorlage – Referenz

"Hooks": { "Logical ID": { "Properties": { "TrafficRoutingConfig": { "Type": "Traffic routing type" "TimeBasedCanary": { "StepPercentage": Integer, "BakeTimeMins": Integer } "TimeBasedLinear": { "StepPercentage": Integer, "BakeTimeMins": Integer } }, "AdditionalOptions": { "TerminationWaitTimeInMinutes": Integer }, "LifecycleEventHooks": { "BeforeInstall": "FunctionName", "AfterInstall": "FunctionName", "AfterAllowTestTraffic": "FunctionName", "BeforeAllowTraffic": "FunctionName", "AfterAllowTraffic": "FunctionName" }, "ServiceRole": "CodeDeployServiceRoleName", "Applications": [{ "Target": { "Type": "AWS::ECS::Service", "LogicalID": "Resource Logical ID" }, "ECSAttributes": { "TaskDefinitions": ["AWS::ECS::TaskDefinition Resource Logical ID (Blue)", "AWS::ECS::TaskDefinition Resource Logical ID (Green)"], "TaskSets": ["AWS::ECS::TaskSet Resource Logical ID (Blue)", "AWS::ECS::TaskSet Resource Logical ID (Green)"], "TrafficRouting": { "ProdTrafficRoute": { "Type": "AWS::ElasticLoadBalancingV2::Listener", "LogicalID": "Resource Logical ID (Production)" }, "TestTrafficRoute": { "Type": "AWS::ElasticLoadBalancingV2::Listener", "LogicalID": "Resource Logical ID (Test)" }, "TargetGroups": [ "AWS::ElasticLoadBalancingV2::TargetGroup Resource Logical ID (Blue)", "AWS::ElasticLoadBalancingV2::TargetGroup Resource Logical ID (Green)" ] } } } ] }, "Type": "AWS::CodeDeploy::BlueGreen" }

Properties

Logical ID

Die logische ID muss alphanumerisch (A-Za-z0-9) und innerhalb der Vorlage eindeutig sein.

Required: Yes

Properties

Eigenschaften des Hooks.

Required: Yes

TrafficRoutingConfig

Konfigurationseinstellungen für Datenverkehrsweiterleitungen

Required: No

Die Standardkonfiguration ist eine zeitbasierte Verschiebung des Canary-Verkehrs mit einem Schrittprozentsatz von 15 % und einer Bake-Zeit von fünf Minuten.

Type

Der Typ des Datenverkehrs, der von der Bereitstellungskonfiguration verwendet wird.

Gültige Werte: AllAtOnce | TimeBasedCanary | TimeBasedLinear

Required: Yes

TimeBasedCanary

Gibt eine Konfiguration an, die den Datenverkehr in zwei Schritten von einer Version der Bereitstellung auf eine andere verlagert.

Required: Conditional: Wenn Sie TimeBasedCanary als Datenverkehrs-Weiterleitungstyp angeben, müssen Sie den Parameter TimeBasedCanary einschließen.

StepPercentage

Der Prozentsatz des Datenverkehrs, der im ersten Schritt einer TimeBasedCanary-Bereitstellung verschoben werden soll. Der Schrittprozentsatz muss 14 % oder höher sein.

Required: No

BakeTimeMins

Die Anzahl der Minuten zwischen der ersten und zweiten Verkehrsverschiebung einer TimeBasedCanary-Bereitstellung.

Required: No

TimeBasedLinear

Gibt eine Konfiguration an, die den Datenverkehr in gleichen Schritten von einer Version der Bereitstellung in ein anderes gleiches Inkrement verlagert, wobei zwischen jedem Inkrement eine gleiche Anzahl von Minuten liegt.

Required: Conditional: Wenn Sie TimeBasedLinear als Datenverkehrs-Weiterleitungstyp angeben, müssen Sie den Parameter TimeBasedLinear einschließen.

StepPercentage

Der Prozentsatz des Datenverkehrs, der zu Beginn jedes Inkrements einer TimeBasedLinear-Bereitstellung verschoben wird. Der Schrittprozentsatz muss 14 % oder höher sein.

Required: No

BakeTimeMins

Die Anzahl der Minuten zwischen jeder inkrementellen Verkehrsverschiebung einer TimeBasedLinear-Bereitstellung.

Required: No

AdditionalOptions

Zusätzliche Optionen für die Blau/Grün-Bereitstellung.

Required: No

TerminationWaitTimeInMinutes

Gibt die Wartezeit in Minuten an, bevor die blauen Ressourcen beendet werden.

Required: No

LifecycleEventHooks

Verwenden Sie Lifecycle-Ereignis-Hooks, um eine Lambda-Funktion anzugeben, die CodeDeploy zur Validierung einer Bereitstellung aufrufen kann. Sie können dieselbe Funktion oder eine andere für die Bereitstellungs-Lebenszyklusereignisse verwenden. Nach Abschluss der Validierungstests ruft die Lambda AfterAllowTraffic-Funktion CodeDeploy zurück und liefert ein Ergebnis von Succeeded oder Failed.

Weitere Informationen finden Sie im AppSpec-Abschnitt „hooks“ im AWS CodeDeploy-Benutzerhandbuch.

Required: No

BeforeInstall

Funktion zur Ausführung von Aufgaben, bevor der neue Aufgabensatz erstellt ist.

Required: No

AfterInstall

Funktion zur Ausführung von Aufgaben nach Erstellung des neuen Aufgabensatzes und Zuordnung einer der Zielgruppen.

Required: No

AfterAllowTestTraffic

Funktion zur Ausführung von Aufgaben, wenn der Test-Listener Datenverkehr an den neuen Aufgabensatz sendet.

Required: No

BeforeAllowTraffic

Funktion zur Ausführung von Aufgaben, wenn die zweite Zielgruppe dem neuen Aufgabensatz zugeordnet ist, aber bevor Datenverkehr an den neuen Aufgabensatz umgeleitet wurde.

Required: No

AfterAllowTraffic

Funktion zur Ausführung von Aufgaben, wenn die zweite Zielgruppe Datenverkehr an den neuen Aufgabensatz sendet.

Required: No

ServiceRole

Die Ausführungsrolle, die CloudFormation zum Ausführen der Blau/Grün-Bereitstellungen verwendet. Eine Liste der erforderlichen Berechtigungen finden Sie unter Für Blau/Grün-Bereitstellungen erforderliche IAM-Berechtigungen.

Required: Yes

Applications

Gibt die Eigenschaften der Amazon ECS-Anwendung an.

Required: Yes

Target

Required: Yes

Type

Der Ressourcentyp.

Required: Yes

LogicalID

Die logische ID der Ressource.

Required: Yes

ECSAttributes

Die Ressourcen, die die verschiedenen Anforderungen Ihrer Amazon ECS-Anwendungsbereitstellung darstellen.

Required: Yes

TaskDefinitions

Die logische ID der AWS::ECS::TaskDefinition-Ressource zum Ausführen des Docker-Containers, der Ihre Amazon ECS-Anwendung enthält.

Required: Yes

TaskSets

Die logischen IDs der AWS::ECS::TaskSet-Ressourcen, die als Aufgabensätze für die Anwendung verwendet werden sollen.

Required: Yes

TrafficRouting

Gibt Ressourcen an, die für das Weiterleiten des Datenverkehrs verwendet werden.

Required: Yes

ProdTrafficRoute

Der Listener, der von Ihrem Load Balancer verwendet wird, um Datenverkehr an Ihre Zielgruppen weiterzuleiten.

Required: Yes

Type

Der Typ der Ressource. AWS::ElasticLoadBalancingV2::Listener

Required: Yes

LogicalID

Die logische ID der Ressource.

Required: Yes

TestTrafficRoute

Der Listener, der von Ihrem Load Balancer verwendet wird, um Datenverkehr an Ihre Zielgruppen weiterzuleiten.

Required: Yes

Type

Der Typ der Ressource. AWS::ElasticLoadBalancingV2::Listener

Required: Yes

LogicalID

Die logische ID der Ressource.

Required: No

TargetGroups

Logische ID der Ressourcen, die als Zielgruppen verwendet werden sollen, um den Datenverkehr an das registrierte Ziel weiterzuleiten.

Required: Yes

Type

Der Typ des Hooks. AWS::ElasticLoadBalancingV2::Listener

Required: Yes

Für Blau/Grün-Bereitstellungen erforderliche IAM-Berechtigungen

Damit CloudFormation die blaugrünen Bereitstellungen erfolgreich durchführen kann, müssen Sie über die folgenden CodeDeploy-Berechtigungen verfügen:

  • codedeploy:Get*

  • codedeploy:CreateCloudFormationDeployment

Weitere Informationen finden Sie unter Aktionen, Ressourcen und Bedingungsschlüssel für CodeDeploy im AWS Identity and Access Management-Benutzerhandbuch.

Vorlagenbeispiel

Im folgenden Beispiel wird eine ECS-Blau/Grün-Bereitstellung über CodeDeploy mit einem Datenverkehrs-Weiterleitungsfortschritt von 15 % pro Schritt mit einer Stabilisierungsdauer von 5 Minuten zwischen jedem Schritt eingerichtet. Das Erstellen eines Stacks mit der Vorlage würde die anfängliche Konfiguration der Bereitstellung einrichten.

Wenn Sie dann Änderungen an Eigenschaften in der "BlueTaskSet"-Ressource vorgenommen haben, für die diese Ressource ersetzt werden muss, würde CloudFormation eine Grün-Bereitstellung als Teil der Stack-Aktualisierung initiieren.

JSON

{ "Parameters": { "Vpc": { "Type": "AWS::EC2::VPC::Id" }, "Subnet1": { "Type": "AWS::EC2::Subnet::Id" }, "Subnet2": { "Type": "AWS::EC2::Subnet::Id" } }, "Transform": [ "AWS::CodeDeployBlueGreen" ], "Hooks": { "CodeDeployBlueGreenHook": { "Properties": { "TrafficRoutingConfig": { "Type": "TimeBasedCanary", "TimeBasedCanary": { "StepPercentage": 15, "BakeTimeMins": 5 } }, "Applications": [ { "Target": { "Type": "AWS::ECS::Service", "LogicalID": "ECSDemoService" }, "ECSAttributes": { "TaskDefinitions": [ "BlueTaskDefinition", "GreenTaskDefinition" ], "TaskSets": [ "BlueTaskSet", "GreenTaskSet" ], "TrafficRouting": { "ProdTrafficRoute": { "Type": "AWS::ElasticLoadBalancingV2::Listener", "LogicalID": "ALBListenerProdTraffic" }, "TargetGroups": [ "ALBTargetGroupBlue", "ALBTargetGroupGreen" ] } } } ] }, "Type": "AWS::CodeDeploy::BlueGreen" } }, "Resources": { "ExampleSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Security group for ec2 access", "VpcId": { "Ref": "Vpc" }, "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" }, { "IpProtocol": "tcp", "FromPort": 8080, "ToPort": 8080, "CidrIp": "0.0.0.0/0" }, { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } }, "ALBTargetGroupBlue": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { "HealthCheckIntervalSeconds": 5, "HealthCheckPath": "/", "HealthCheckPort": "80", "HealthCheckProtocol": "HTTP", "HealthCheckTimeoutSeconds": 2, "HealthyThresholdCount": 2, "Matcher": { "HttpCode": "200" }, "Port": 80, "Protocol": "HTTP", "Tags": [ { "Key": "Group", "Value": "Example" } ], "TargetType": "ip", "UnhealthyThresholdCount": 4, "VpcId": { "Ref": "Vpc" } } }, "ALBTargetGroupGreen": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { "HealthCheckIntervalSeconds": 5, "HealthCheckPath": "/", "HealthCheckPort": "80", "HealthCheckProtocol": "HTTP", "HealthCheckTimeoutSeconds": 2, "HealthyThresholdCount": 2, "Matcher": { "HttpCode": "200" }, "Port": 80, "Protocol": "HTTP", "Tags": [ { "Key": "Group", "Value": "Example" } ], "TargetType": "ip", "UnhealthyThresholdCount": 4, "VpcId": { "Ref": "Vpc" } } }, "ExampleALB": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internet-facing", "SecurityGroups": [ { "Ref": "ExampleSecurityGroup" } ], "Subnets": [ { "Ref": "Subnet1" }, { "Ref": "Subnet2" } ], "Tags": [ { "Key": "Group", "Value": "Example" } ], "Type": "application", "IpAddressType": "ipv4" } }, "ALBListenerProdTraffic": { "Type": "AWS::ElasticLoadBalancingV2::Listener", "Properties": { "DefaultActions": [ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": { "Ref": "ALBTargetGroupBlue" }, "Weight": 1 } ] } } ], "LoadBalancerArn": { "Ref": "ExampleALB" }, "Port": 80, "Protocol": "HTTP" } }, "ALBListenerProdRule": { "Type": "AWS::ElasticLoadBalancingV2::ListenerRule", "Properties": { "Actions": [ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": { "Ref": "ALBTargetGroupBlue" }, "Weight": 1 } ] } } ], "Conditions": [ { "Field": "http-header", "HttpHeaderConfig": { "HttpHeaderName": "User-Agent", "Values": [ "Mozilla" ] } } ], "ListenerArn": { "Ref": "ALBListenerProdTraffic" }, "Priority": 1 } }, "ECSTaskExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }, "ManagedPolicyArns": [ "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" ] } }, "BlueTaskDefinition": { "Type": "AWS::ECS::TaskDefinition", "Properties": { "ExecutionRoleArn": { "Fn::GetAtt": [ "ECSTaskExecutionRole", "Arn" ] }, "ContainerDefinitions": [ { "Name": "DemoApp", "Image": "nginxdemos/hello:latest", "Essential": true, "PortMappings": [ { "HostPort": 80, "Protocol": "tcp", "ContainerPort": 80 } ] } ], "RequiresCompatibilities": [ "FARGATE" ], "NetworkMode": "awsvpc", "Cpu": "256", "Memory": "512", "Family": "ecs-demo" } }, "ECSDemoCluster": { "Type": "AWS::ECS::Cluster", "Properties": {} }, "ECSDemoService": { "Type": "AWS::ECS::Service", "Properties": { "Cluster": { "Ref": "ECSDemoCluster" }, "DesiredCount": 1, "DeploymentController": { "Type": "EXTERNAL" } } }, "BlueTaskSet": { "Type": "AWS::ECS::TaskSet", "Properties": { "Cluster": { "Ref": "ECSDemoCluster" }, "LaunchType": "FARGATE", "NetworkConfiguration": { "AwsVpcConfiguration": { "AssignPublicIp": "ENABLED", "SecurityGroups": [ { "Ref": "ExampleSecurityGroup" } ], "Subnets": [ { "Ref": "Subnet1" }, { "Ref": "Subnet2" } ] } }, "PlatformVersion": "1.4.0", "Scale": { "Unit": "PERCENT", "Value": 100 }, "Service": { "Ref": "ECSDemoService" }, "TaskDefinition": { "Ref": "BlueTaskDefinition" }, "LoadBalancers": [ { "ContainerName": "DemoApp", "ContainerPort": 80, "TargetGroupArn": { "Ref": "ALBTargetGroupBlue" } } ] } }, "PrimaryTaskSet": { "Type": "AWS::ECS::PrimaryTaskSet", "Properties": { "Cluster": { "Ref": "ECSDemoCluster" }, "Service": { "Ref": "ECSDemoService" }, "TaskSetId": { "Fn::GetAtt": [ "BlueTaskSet", "Id" ] } } } } }

YAML

Parameters: Vpc: Type: 'AWS::EC2::VPC::Id' Subnet1: Type: 'AWS::EC2::Subnet::Id' Subnet2: Type: 'AWS::EC2::Subnet::Id' Transform: - 'AWS::CodeDeployBlueGreen' Hooks: CodeDeployBlueGreenHook: Properties: TrafficRoutingConfig: Type: TimeBasedCanary TimeBasedCanary: StepPercentage: 15 BakeTimeMins: 5 Applications: - Target: Type: 'AWS::ECS::Service' LogicalID: ECSDemoService ECSAttributes: TaskDefinitions: - BlueTaskDefinition - GreenTaskDefinition TaskSets: - BlueTaskSet - GreenTaskSet TrafficRouting: ProdTrafficRoute: Type: 'AWS::ElasticLoadBalancingV2::Listener' LogicalID: ALBListenerProdTraffic TargetGroups: - ALBTargetGroupBlue - ALBTargetGroupGreen Type: 'AWS::CodeDeploy::BlueGreen' Resources: ExampleSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Security group for ec2 access VpcId: !Ref Vpc SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 8080 ToPort: 8080 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0 ALBTargetGroupBlue: Type: 'AWS::ElasticLoadBalancingV2::TargetGroup' Properties: HealthCheckIntervalSeconds: 5 HealthCheckPath: / HealthCheckPort: '80' HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 2 HealthyThresholdCount: 2 Matcher: HttpCode: '200' Port: 80 Protocol: HTTP Tags: - Key: Group Value: Example TargetType: ip UnhealthyThresholdCount: 4 VpcId: !Ref Vpc ALBTargetGroupGreen: Type: 'AWS::ElasticLoadBalancingV2::TargetGroup' Properties: HealthCheckIntervalSeconds: 5 HealthCheckPath: / HealthCheckPort: '80' HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 2 HealthyThresholdCount: 2 Matcher: HttpCode: '200' Port: 80 Protocol: HTTP Tags: - Key: Group Value: Example TargetType: ip UnhealthyThresholdCount: 4 VpcId: !Ref Vpc ExampleALB: Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer' Properties: Scheme: internet-facing SecurityGroups: - !Ref ExampleSecurityGroup Subnets: - !Ref Subnet1 - !Ref Subnet2 Tags: - Key: Group Value: Example Type: application IpAddressType: ipv4 ALBListenerProdTraffic: Type: 'AWS::ElasticLoadBalancingV2::Listener' Properties: DefaultActions: - Type: forward ForwardConfig: TargetGroups: - TargetGroupArn: !Ref ALBTargetGroupBlue Weight: 1 LoadBalancerArn: !Ref ExampleALB Port: 80 Protocol: HTTP ALBListenerProdRule: Type: 'AWS::ElasticLoadBalancingV2::ListenerRule' Properties: Actions: - Type: forward ForwardConfig: TargetGroups: - TargetGroupArn: !Ref ALBTargetGroupBlue Weight: 1 Conditions: - Field: http-header HttpHeaderConfig: HttpHeaderName: User-Agent Values: - Mozilla ListenerArn: !Ref ALBListenerProdTraffic Priority: 1 ECSTaskExecutionRole: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Sid: '' Effect: Allow Principal: Service: ecs-tasks.amazonaws.com Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy' BlueTaskDefinition: Type: 'AWS::ECS::TaskDefinition' Properties: ExecutionRoleArn: !GetAtt - ECSTaskExecutionRole - Arn ContainerDefinitions: - Name: DemoApp Image: 'nginxdemos/hello:latest' Essential: true PortMappings: - HostPort: 80 Protocol: tcp ContainerPort: 80 RequiresCompatibilities: - FARGATE NetworkMode: awsvpc Cpu: '256' Memory: '512' Family: ecs-demo ECSDemoCluster: Type: 'AWS::ECS::Cluster' Properties: {} ECSDemoService: Type: 'AWS::ECS::Service' Properties: Cluster: !Ref ECSDemoCluster DesiredCount: 1 DeploymentController: Type: EXTERNAL BlueTaskSet: Type: 'AWS::ECS::TaskSet' Properties: Cluster: !Ref ECSDemoCluster LaunchType: FARGATE NetworkConfiguration: AwsVpcConfiguration: AssignPublicIp: ENABLED SecurityGroups: - !Ref ExampleSecurityGroup Subnets: - !Ref Subnet1 - !Ref Subnet2 PlatformVersion: 1.4.0 Scale: Unit: PERCENT Value: 100 Service: !Ref ECSDemoService TaskDefinition: !Ref BlueTaskDefinition LoadBalancers: - ContainerName: DemoApp ContainerPort: 80 TargetGroupArn: !Ref ALBTargetGroupBlue PrimaryTaskSet: Type: 'AWS::ECS::PrimaryTaskSet' Properties: Cluster: !Ref ECSDemoCluster Service: !Ref ECSDemoService TaskSetId: !GetAtt - BlueTaskSet - Id