42 votes

Comment redémarrer toutes les tâches d'un service ?

Nous avons une tâche qui charge certains fichiers de configuration à partir d'une source de données externe. Une fois les paramètres téléchargés, nous aimerions pouvoir redémarrer toutes les tâches d'un service afin que les paramètres se propagent à toutes les instances.

Quelle est la meilleure façon de redémarrer tous les services ?

Nous avons une solution de contournement qui consiste à régler le "nombre de tâches" sur 0, puis à effectuer une sauvegarde, mais ce n'est pas du tout la façon dont il faut procéder et cela entraîne des temps d'arrêt.

0voto

Orbling Points 191

D'après la documentation d'Amazon, il semble que vous devriez pouvoir script les opérations en question à l'aide de la commande Appels de l'API UpdateService . Il y a quelques exemples de code disponibles sur le lien précédent, il semble possible que vous puissiez vous adapter. Il semble qu'écrire un script pour s'occuper de recharger les services en utilisant la définition de tâche appropriée après les mises à jour des configurations de tâches serait la solution la plus élégante au problème.

Il y a plus de documentation sur l'utilisation de AWS CLI avec ECS qui semble être le moyen le plus simple de gérer le redémarrage des services par script batch.

0voto

tagplus5 Points 248

Fonctionne très bien https://github.com/fdfk/ecsServiceRestart

python ecsServiceRestart.py restart --services="app app2" --cluster=test

0voto

nroose Points 131

J'ai travaillé sur ce sujet. Il serait très utile de pouvoir redémarrer une tâche à la fois de manière fiable. Le script ci-dessous est ce que j'utilise actuellement. Il est assez prudent. Il faut appuyer sur return pour chaque tâche. Il y a une commande pour attendre que le service soit stable, mais cela ne signifie pas que la tâche est saine. Et je pourrais mettre un délai. Mais en fin de compte, si les choses vont mal, le script tuerait lentement l'application. Donc...

#!/bin/bash

if [ $# -eq 2 ]
then
    cluster=$1
    service=$2
else
    echo "Usage: $0 <cluster> <service>"
    exit 1
fi

echo
echo "Restarting $cluster $service tasks:"
echo

for task in $(aws ecs list-tasks --cluster $cluster --service-name $service | awk '{print $2}')
do
    echo
    echo -n "Press enter to stop $task"
    read -r
    echo
    echo "stopping $task..."
    aws ecs stop-task --cluster "$cluster" --task "$task"
    echo
    # aws ecs wait services-stable --cluster "$cluster" --services "$service"    done

0voto

pnocti Points 1

J'ai un script Python boto3 script qui fait le ff :

  1. créer une liste de tâches avec le statut 'RUNNING' pour un service via

ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')

  1. faire un boucle for pour la liste des tâches ci-dessus et arrêter chacune d'entre elles via

ecs_client.stop_task(cluster=mycluster,task=mytask)

  1. décrire le service pour obtenir le runningCount et le desiredCount

ecs_client.describe_services(cluster=mycluster,services=[myservice])

  1. boucle while if runningCount < desiredCount -- ce qui signifie qu'une tâche est en train d'être arrêtée et n'a pas encore été remplacée, donc n'arrêtez pas encore la tâche suivante !

while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:

Si la boucle while n'est plus vraie -- ce qui signifie que les comptes en cours et souhaités sont égaux, arrêter la tâche suivante dans la liste.

Il s'agit du flux réel et je ne peux pas montrer le code réel car je suis toujours employé par mon travail actuel et tout mon code leur appartient :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X