Passer au contenu

Comment puis-je configurer et surveiller le disjoncteur de déploiement Amazon ECS ?

Lecture de 6 minute(s)
0

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 :

  1. Configurez le disjoncteur de déploiement.
  2. Configurez Amazon EventBridge pour surveiller le disjoncteur de déploiement.
  3. 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 :

  1. Créez un fichier JSON avec une définition de tâche similaire à l'exemple suivant :
    {
        "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"
    }
    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.
  2. 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-success.json
    Remarque : Remplacez taskdef-success.json par votre fichier JSON de définition de tâche.
  3. 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 :
    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}"
    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.
    Si vous ne disposez pas de cluster par défaut, exécutez la commande create-cluster suivante pour créer le cluster :
    aws ecs create-cluster \
        --cluster-name example-cluster
    Remarque : Remplacez example-cluster par le nom de votre cluster.
  4. Exécutez la commande describe-services suivante pour vérifier que le service Amazon ECS est à l'état Stable :
    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) has started 1 tasks: (task 2918eb15dd0f4d42affc2a3a07818abf)."
    }

Configurer EventBridge pour surveiller le disjoncteur de déploiement

Procédez comme suit :

  1. 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-topic

    Remarque : Remplacez my-topic par le nom de votre rubrique SNS.

  2. 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.

  3. 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.com

    Remarque : 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.

  4. Dans l'e-mail de confirmation d'abonnement que vous recevez, sélectionnez Confirmer l'abonnement.

  5. 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\"]}}"
  6. 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 :

  1. 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.

  2. 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.json

    Remarque : Remplacez taskdef-failure.json par le titre de votre fichier JSON de définition de tâche.

  3. 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:2

    Remarque : 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."
        }
    }
  4. 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

Annonce du disjoncteur de déploiement d'Amazon ECS

AWS OFFICIELA mis à jour il y a 2 ans