Le service ECS ne met pas à jour la définition de tâche

8

Dans le cluster ecs, j'ai un service fonctionnant avec 2 instances ec2. Et je mets à jour la définition de la tâche pour prendre la nouvelle image docker. Mais l'ancienne définition de tâche est toujours en cours d'exécution même s'il existe une nouvelle définition de tâche.

J'ai utilisé les commandes suivantes pour mettre à jour la définition de tâche et le service.

aws ecs register-task-definition --family service90-task --cli-input-json file://service90-task.json

aws ecs update-service --cluster service90-cluster --service service90-service --desired-count 0

TASK_REVISION=`aws ecs describe-task-definition --task-definition service90-task | egrep "revision" | tr "/" " " | awk '{print $2}' | sed 's/"$//'`

aws ecs update-service --cluster service90-cluster --service service90-service --task-definition service90-task:${TASK_REVISION} --desired-count 2

J'ai essayé plusieurs fois mais je n'arrive pas à comprendre où je me suis trompé. Je veux que le service ecs exécute la nouvelle définition de tâche au lieu de l'ancienne.

Lahiru Liyanapathirana
la source

Réponses:

7

Comme je l'ai découvert plus tard, la raison pour ne pas mettre à jour la tâche est que le nombre souhaité est défini sur 2 et qu'il n'y a que 2 instances EC2 disponibles. L'agent ECS essaie donc de conserver le nombre souhaité même si la tâche a été mise à jour.

Solution - Avoir une instance EC2 supplémentaire (dans ce cas, 3 instances EC2). Ou disposez d'une instance supplémentaire par rapport au nombre de tâches préféré.

De cette façon, la nouvelle définition de tâche peut s'exécuter sur l'instance supplémentaire. Une fois stabilisé sur l'instance EC2 supplémentaire, l'agent ECS drainera la connexion sur les deux autres instances pour l'ancienne définition de tâche, tandis que l'équilibreur de charge redirigera le trafic vers l'instance mise à jour. L'agent ECS remplace l'ancienne définition de tâche par les nouvelles. Et puis il maintient le nombre souhaité à 2.

Lahiru Liyanapathirana
la source
2

Une autre solution consiste à définir l' Minimum healthy percentoption de déploiement du service sur 0, ce qui entraîne l'arrêt des tâches existantes avant le déploiement de la nouvelle version.

Cela permet d'utiliser des clusters d'instances ec2 uniques, avec les économies de coûts associées, etc.

Ne convient pas à la production car vous aurez des temps d'arrêt entre les déploiements

Nick Hammond
la source
Des jours d'enquête et de redémarrage du serveur, résolus par cette réponse! Merci :)
Neara
2

Pour mettre à jour une définition de tâche dans les "tâches" en cours d'exécution dans le service Vous devez supprimer les tâches et démarrer une nouvelle tâche.

De cette façon, je résous le problème de la mise à jour de la définition des tâches dans les tâches

J'ai écrit le code suivant:

    # Register a new Task definition 
    aws ecs register-task-definition --family testing-cluster --cli-input-json file://scripts/taskdefinition/testingtaskdef.json --region $AWS_REGION

    # Update Service in the Cluster
    aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE --task-definition testing-cluster --desired-count 1 --region $AWS_REGION 



    DECRIBED_SERVICE=$(aws ecs describe-services --region $AWS_REGION --cluster $CLUSTER_NAME --services $SERVICE);
    CURRENT_DESIRED_COUNT=$(echo $DECRIBED_SERVICE | jq --raw-output ".services[0].desiredCount")
    #    - echo $CURRENT_DESIRED_COUNT

    CURRENT_TASK_REVISION=$(echo $DECRIBED_SERVICE | jq -r ".services[0].taskDefinition")
    echo "Current Task definition in Service" + $CURRENT_TASK_REVISION

    CURRENT_RUNNING_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].runningCount")
    echo $CURRENT_RUNNING_TASK

    CURRENT_STALE_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].deployments | .[] | select(.taskDefinition != \"$CURRENT_TASK_REVISION\") | .taskDefinition")
    echo "Task defn apart from current service Taskdefn" +  $CURRENT_STALE_TASK
    #   - echo $CURRENT_STALE_TASK

    tasks=$(aws ecs --region $AWS_REGION list-tasks --cluster $CLUSTER_NAME | jq -r '.taskArns | map(.[40:]) | reduce .[] as $item (""; . + $item + " ")')
    echo "Tasks are as follows" 
    echo $tasks
    TASKS=$(aws ecs --region $AWS_REGION describe-tasks --cluster $CLUSTER_NAME --task $tasks);
    #    - echo $TASKS
    OLDER_TASK=$(echo $TASKS | jq -r ".tasks[] | select(.taskDefinitionArn!= \"$CURRENT_TASK_REVISION\") | .taskArn | split(\"/\") | .[1] ")
    echo "Older Task running  " + $OLDER_TASK
    for old_task in $OLDER_TASK; do
        aws ecs --region us-east-1 stop-task --cluster $CLUSTER_NAME --task $old_task
    done    

    # Run new tasks with the updated new Task-definition
    aws ecs --region $AWS_REGION run-task --cluster $CLUSTER_NAME --task-definition $CURRENT_TASK_REVISION
Roopa
la source
0

Je me gratte la tête depuis longtemps et je n'ai trouvé de solution viable nulle part avant la semaine dernière.

AWS vient de publier sa nouvelle API où ils ont l' option --force pour la suppression du service. Le problème du groupe cible auquel vous êtes confronté est simplement parce que le groupe cible enregistré avec votre tâche est déjà supprimé et que vous ne pouvez pas lui associer un nouveau groupe cible. Donc, puisque cette tâche et ce service sont corrompus maintenant, la seule façon de traiter est de les supprimer, vous ne pouvez plus les mettre à jour.

Vous pouvez utiliser cette commande pour supprimer votre service maintenant; c'était impossible la semaine dernière!

aws ecs delete-service --service my-http-service --force true

J'espère que cela t'aides

neocorp
la source