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 TransformationAWS::CodeDeployBlueGreen
aufruft, sowie einHook
-Abschnitt, der den HookAWS::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
undAWS::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
undTransform
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:
Parameter, die mit dem Attribut
NoEcho
definiert sind.Parameter, die dynamische Referenzen verwenden, um ihre Werte von externen Diensten abzurufen. Weitere Informationen finden Sie unter Verwenden von dynamischen Verweisen zum Angeben von Vorlagenwerten.
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 HookAWS::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 ParameterTimeBasedCanary
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 ParameterTimeBasedLinear
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
oderFailed
.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