Wie konfiguriere und überwache ich den Amazon ECS-Bereitstellungsschutzschalter?
Ich möchte das Rollback automatisieren und Benachrichtigungen erhalten, wenn meine Amazon Elastic Container Service (Amazon ECS)-Bereitstellung fehlschlägt.
Kurzbeschreibung
Gehe wie folgt vor, um das Rollback zu automatisieren und Bereitstellungen mit dem Amazon ECS-Bereitstellungsschutzschalter zu überwachen:
- Konfiguriere den Bereitstellungsschutzschalter.
- Konfiguriere Amazon EventBridge so, dass der Bereitstellungsschalter überwacht wird.
- Teste das Szenario eines Bereitstellungsfehlers.
Lösung
Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.
Den Bereitstellungsschutzschalter konfigurieren
Führe die folgenden Schritte aus:
- Erstelle eine JSON-Datei mit einer Aufgabendefinition, die dem folgenden Beispiel ähnelt:
Hinweis: Ersetze 123456789876 durch die AWS-Konto-ID. Wenn du keine ecsTaskExecutionRole hast, erstelle eine Aufgabenausführungsrolle.{ "family": "my-task", "containerDefinitions": [ { "name": "sample-container", "image": "nginx:alpine", "essential": true } ], "executionRoleArn": "arn:aws:iam::123456789876:role/ecsTaskExecutionRole", "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" } - Führe den folgenden Befehl register-task-definition aus, um die Aufgabendefinition zu registrieren:
Hinweis: Ersetze taskdef-success.json durch die JSON-Datei mit der Aufgabendefinition.aws ecs register-task-definition \ --cli-input-json file://taskdef-success.json - Um einen Amazon ECS-Service mit aktiviertem Bereitstellungsschutzschalter und Rollback zu erstellen, führe den folgenden Befehl create-service aus:
Hinweis: Ersetze subnet-12345 durch das Subnetz und sg-12345 durch die Sicherheitsgruppen. Du musst deployment-controller auf type=ECS setzen, da der Bereitstellungsschutzschalter nur für Bereitstellungen mit fortlaufenden Updates verfügbar ist.aws ecs create-service \ --cluster default \ --service-name my-sample-service \ --deployment-controller type=ECS \ --desired-count 1 \ --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \ --task-definition my-task:1 \ --launch-type FARGATE \ --network-configuration "awsvpcConfiguration={subnets=[subnet-12345],securityGroups=[sg-12345],assignPublicIp=ENABLED}"
Wenn du keinen Standard-Cluster hast, führe den folgenden Befehl create-cluster aus, um den Cluster zu erstellen:
Hinweis: Ersetze example-cluster durch deinen Cluster-Namen.aws ecs create-cluster \ --cluster-name example-cluster - Führe den folgenden Befehl describe-services aus, um zu bestätigen, dass sich der Amazon ECS-Service im Status Stabil befindet:
Du erhältst eine Ausgabe, die dem folgenden Beispiel ähnelt:aws ecs describe-services \ --cluster default \ --services my-sample-service | jq '.services[0].events[] | {message}'{ "message": "(service my-sample-service) has reached a steady state." } { "message": "(service my-sample-service) (deployment ecs-svc/1234567890123456789) deployment completed." } { "message": "(service my-sample-service) has started 1 tasks: (task 2918eb15dd0f4d42affc2a3a07818abf)." }
EventBridge so konfigurieren, dass der Bereitstellungsschalter überwacht wird
Führe die folgenden Schritte aus:
-
Führe den folgenden Befehl create-topic aus, um ein Amazon Simple Notification Service (Amazon SNS)-Thema zu erstellen, das als EventBridge-Regelziel verwendet werden soll:
aws sns create-topic \ --name my-topicHinweis: Ersetze my-topic durch den Namen des SNS-Themas.
-
Um die Themenattribute so zu aktualisieren, dass Aufrufe der erforderlichen APIs möglich sind, führe den folgenden Befehl set-topic-attributes aus:
aws sns set-topic-attributes \ --topic-arn arn:aws:sns:eu-west-1:123456789876:my-topic \ --attribute-name Policy \ --attribute-value '{ "Version": "2008-10-17", "Id": "my_topic_policy", "Statement": [ { "Sid": "my_topic_default", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "SNS:GetTopicAttributes", "SNS:SetTopicAttributes", "SNS:AddPermission", "SNS:RemovePermission", "SNS:DeleteTopic", "SNS:Subscribe", "SNS:ListSubscriptionsByTopic", "SNS:Publish" ], "Resource": "arn:aws:sns:eu-west-1:123456789876:my-topic", "Condition": { "StringEquals": { "AWS:SourceOwner": "123456789876" } } }, { "Sid": "my_topic_for_sns_Publish", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:eu-west-1:123456789876:my-topic" } ] }'Hinweis: Ersetze eu-west-1 durch die AWS-Region, 123456789876 durch die Konto-ID, my-topic durch den Themennamen.
-
Um das SNS-Thema mit der E-Mail zu abonnieren, führe den folgenden subscribe-Befehl aus:
aws sns subscribe \ --topic-arn arn:aws:sns:eu-west-1:123456789876:my-topic \ --protocol email \ --notification-endpoint example@example.comHinweis: Ersetze eu-west-1 durch die Region, 123456789876 durch die Konto-ID, my-topic durch den Themennamen und example@example.com durch den E-Mail-Adresse.
-
Wähle in der Bestätigungs-E-Mail, die du erhältst, die Option Abonnement bestätigen aus.
-
Führe den folgenden put-rule-Befehl aus, um eine EventBridge-Regel für fehlgeschlagene Ereignisse bei der Servicebereitstellung zu erstellen:
aws events put-rule \ --name "EcsServiceDeploymentFailed" \ --event-pattern "{\"source\":[\"aws.ecs\"],\"detail-type\":[\"ECS Deployment State Change\"],\"detail\":{\"eventName\":[\"SERVICE_DEPLOYMENT_FAILED\"]}}" -
Um das SNS-Thema als EventBridge-Regelziel hinzuzufügen, führe den folgenden Befehl put-targets aus:
aws events put-targets \ --rule EcsServiceDeploymentFailed --targets "Id"="1","Arn"="arn:aws:sns:eu-west-1:123456789876:my-topic"Hinweis: Ersetze eu-west-1 durch die Region, 123456789876 durch die Konto-ID und my-topic durch die Themennamen.
Das Szenario eines Bereitstellungsfehlers testen
Führe die folgenden Schritte aus:
-
Erstelle eine JSON-Datei mit einem falschen Image-Tag in ihrer Aufgabendefinition, das der folgenden ähnelt:
{ "family": "my-task", "containerDefinitions": [ { "name": "sample-container", "image": "nginx:wrong-image-tag", "essential": true } ], "executionRoleArn": "arn:aws:iam::123456789876:role/ecsTaskExecutionRole", "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" }Hinweis: Ersetze sample-container durch die Container-Instance, nginx:wrong-image-tag durch ein falsches Image-Tag und 123456789876 durch die Konto-ID. Ein falsches Image-Tag führt dazu, dass die Bereitstellung fehlschlägt.
-
Führe den folgenden Befehl register-task-definition aus, um die Aufgabendefinition zu registrieren:
aws ecs register-task-definition --cli-input-json file://taskdef-failure.jsonHinweis: Ersetze taskdef-failure.json durch den Titel der JSON-Datei mit der Aufgabendefinition.
-
Um den Service mit der neuen Aufgabendefinition zu aktualisieren und eine neue Bereitstellung zu starten, führe den folgenden update-service-Befehl aus:
aws ecs update-service --service my-sample-service --task-definition my-task:2Hinweis: Ersetze my-sample-service durch den Service und my-task:2 durch die Aufgabe. Die neue Bereitstellung schlägt fehl, weil die Aufgabe das Image nicht abrufen kann. Du erhältst eine Ausgabe, die dem folgenden Beispiel ähnelt:
{ "version": "0", "id": "12345abc-2f7c-f86a-e544-a69218eb1446", "detail-type": "ECS Deployment State Change", "source": "aws.ecs", "account": "123456789876", "time": "2024-11-19T17:42:41Z", "region": "eu-west-1", "resources": [ "arn:aws:ecs:eu-west-1:123456789876:service/default/my-sample-service" ], "detail": { "eventType": "ERROR", "eventName": "SERVICE_DEPLOYMENT_FAILED", "clusterArn": "arn:aws:ecs:eu-west-1:123456789876:cluster/default", "deploymentId": "ecs-svc/9876543210987654321", "updatedAt": "2024-11-19T17:42:40.73Z", "reason": "ECS deployment circuit breaker: tasks failed to start." } } -
Führe den folgenden Befehl describe-services aus, um zu überprüfen, ob der Amazon ECS-Service zurückgesetzt wurde:
aws ecs describe-services \ --cluster default \ --services my-sample-service | jq '.services[0].events[] | {message}'Du erhältst eine Ausgabe, die dem folgenden Beispiel ähnelt:
{ "message": "(service my-sample-service) has reached a steady state." } { "message": "(service my-sample-service) (deployment ecs-svc/1234567890123456789) deployment completed." } { "message": "(service my-sample-service) rolling back to deployment ecs-svc/1234567890123456789." } { "message": "(service my-sample-service) (deployment ecs-svc/9876543210987654321) deployment failed: tasks failed to start." } { "message": "(service my-sample-service) has started 1 tasks: (task b808c60616134ec1ac0c656a2bff1ef2)." } { "message": "(service my-sample-service) has started 1 tasks: (task 846c9aebd9224c2b832a38942cae5ea6)." } { "message": "(service my-sample-service) has started 1 tasks: (task 7143d03444574f2db2b567d75df3fe72)." } { "message": "(service my-sample-service) has started 1 tasks: (task 9a6a399770d940a2b442560c02a6a4c0)." } { "message": "(service my-sample-service) has reached a steady state." } { "message": "(service my-sample-service) (deployment ecs-svc/1234567890123456789) deployment completed." } { "message": "(service my-sample-service) has started 1 tasks: (task 2918eb15dd0f4d42affc2a3a07818abf)." }
Ähnliche Informationen
So erkennt der Amazon ECS-Bereitstellungsschutzschalter Ausfälle
- Themen
- Containers
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 3 Jahren