Comment puis-je configurer et surveiller le disjoncteur de déploiement Amazon ECS ?
Je souhaite automatiser la restauration et recevoir des notifications lorsque mon déploiement Amazon Elastic Container Service (Amazon ECS) échoue.
Brève description
Pour automatiser la restauration et surveiller les déploiements à l'aide du disjoncteur de déploiement Amazon ECS, procédez comme suit :
- Configurez le disjoncteur de déploiement.
- Configurez Amazon EventBridge pour surveiller le disjoncteur de déploiement.
- Testez le scénario d'échec de déploiement.
Résolution
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.
Configurer le disjoncteur de déploiement
Procédez comme suit :
- Créez un fichier JSON avec une définition de tâche similaire à l'exemple suivant :
Remarque : Remplacez 123456789876 par votre ID de compte AWS. Si vous n'avez pas de ecsTaskExecutionRole, créez un rôle d'exécution de tâche.{ "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" } - Pour enregistrer la définition de tâche, exécutez la commande register-task-definition suivante :
Remarque : Remplacez taskdef-success.json par votre fichier JSON de définition de tâche.aws ecs register-task-definition \ --cli-input-json file://taskdef-success.json - Pour créer un service Amazon ECS avec le disjoncteur de déploiement et la restauration activés, exécutez la commande create-service suivante :
Remarque : Remplacez subnet-12345 par votre sous-réseau et sg-12345 par vos groupes de sécurité. Vous devez définir deployment-controller sur type=ECS car le disjoncteur de déploiement n'est disponible que pour les déploiements de mises à jour continues.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}"
Si vous ne disposez pas de cluster par défaut, exécutez la commande create-cluster suivante pour créer le cluster :
Remarque : Remplacez example-cluster par le nom de votre cluster.aws ecs create-cluster \ --cluster-name example-cluster - Exécutez la commande describe-services suivante pour vérifier que le service Amazon ECS est à l'état Stable :
Vous recevez une sortie similaire à l'exemple suivant :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)." }
Configurer EventBridge pour surveiller le disjoncteur de déploiement
Procédez comme suit :
-
Exécutez la commande create-topic suivante pour créer une rubrique Amazon Simple Notification Service (Amazon SNS) à utiliser comme cible de règle EventBridge :
aws sns create-topic \ --name my-topicRemarque : Remplacez my-topic par le nom de votre rubrique SNS.
-
Pour mettre à jour les attributs de rubrique afin d'autoriser les appels des API requises, exécutez la commande set-topic-attributes suivante :
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" } ] }'Remarque : Remplacez eu-west-1 par votre région AWS, 123456789876 par votre ID de compte, my-topic par le nom de votre rubrique.
-
Pour vous abonner à la rubrique SNS avec votre e-mail, exécutez la commande subscribe suivante :
aws sns subscribe \ --topic-arn arn:aws:sns:eu-west-1:123456789876:my-topic \ --protocol email \ --notification-endpoint example@example.comRemarque : Remplacez eu-west-1 par votre région, 123456789876 par votre ID de compte, my-topic par le nom de votre rubrique et example@example.com par votre adresse e-mail.
-
Dans l'e-mail de confirmation d'abonnement que vous recevez, sélectionnez Confirmer l'abonnement.
-
Pour créer une règle EventBridge pour les événements d'échec de déploiement de service, exécutez la commande put-rule suivante :
aws events put-rule \ --name "EcsServiceDeploymentFailed" \ --event-pattern "{\"source\":[\"aws.ecs\"],\"detail-type\":[\"ECS Deployment State Change\"],\"detail\":{\"eventName\":[\"SERVICE_DEPLOYMENT_FAILED\"]}}" -
Pour ajouter la rubrique SNS en tant que cible de règle EventBridge, exécutez la commande put-targets suivante :
aws events put-targets \ --rule EcsServiceDeploymentFailed --targets "Id"="1","Arn"="arn:aws:sns:eu-west-1:123456789876:my-topic"Remarque : Remplacez eu-west-1 par votre région, 123456789876 par votre ID de compte et my-topic par le nom de votre rubrique.
Tester le scénario d'échec de déploiement
Procédez comme suit :
-
Créez un fichier JSON avec une identification d'image incorrecte dans sa définition de tâche, similaire à l’exemple suivant :
{ "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" }Remarque : Remplacez sample-container par votre instance de conteneur, nginx:wrong-image-tag par une identification d’image incorrecte et 123456789876 par votre ID de compte. Une identification d'image incorrecte entraîne l'échec du déploiement.
-
Pour enregistrer la définition de tâche, exécutez la commande register-task-definition suivante :
aws ecs register-task-definition --cli-input-json file://taskdef-failure.jsonRemarque : Remplacez taskdef-failure.json par le titre de votre fichier JSON de définition de tâche.
-
Pour mettre à jour le service avec la nouvelle définition de tâche et démarrer un nouveau déploiement, exécutez la commande update-service suivante :
aws ecs update-service --service my-sample-service --task-definition my-task:2Remarque : Remplace my-sample-service par votre service et my-task:2 par votre tâche. Le nouveau déploiement échoue car la tâche ne peut pas extraire l'image. Vous recevez une sortie similaire à l'exemple suivant :
{ "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." } } -
Pour vérifier que le service Amazon ECS a été restauré, exécutez la commande describe-services suivante :
aws ecs describe-services \ --cluster default \ --services my-sample-service | jq '.services[0].events[] | {message}'Vous recevez une sortie similaire à l'exemple suivant :
{ "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)." }
Informations connexes
Comment le disjoncteur de déploiement Amazon ECS détecte les échecs
- Sujets
- Containers
- Langue
- Français

Contenus pertinents
demandé il y a un an
demandé il y a un an
demandé il y a un an
demandé il y a un an
AWS OFFICIELA mis à jour il y a 2 ans