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.

52voto

Ben Whaley Points 1353

Utilisation de l'outil AWS CLI :

aws ecs update-service --force-new-deployment --service my-service --cluster cluster-name

12voto

ROSHAN THOMAS Points 1

Ce que vous voulez faire revient essentiellement à redéployer le service.

Pour redéployer le service sans interruption de service :

  1. Enregistrer une nouvelle définition de tâche basée sur la tâche actuelle actuelle (avec les mêmes détails)
  2. Appeler UpdateService, en associant le service existant à l'élément nouvelle définition de tâche.

Cela devrait lancer de nouvelles tâches pour la nouvelle définition de tâche et tuer les anciennes tâches pour l'ancienne définition de tâche, redémarrant ainsi les tâches sans temps d'arrêt.

Voir : UpdateService

6voto

user326608 Points 161

Cela a fonctionné pour moi :

aws ecs list-tasks --cluster <cluster_name> | jq -r ".taskArns[]" | awk '{print "aws ecs stop-task --cluster <cluster_name> --task \""$0"\""}' | sh

les tâches sont ensuite recréées sur les mêmes instances.

si vous avez besoin de nouvelles instances, utilisez ceci :

aws ecs list-services --cluster <cluster_name> | jq -r ".serviceArns[]" | awk '{print "aws ecs update-service --cluster <cluster_name> --force-new-deployment  --service \""$0"\""}' | sh

2voto

txbahai Points 29

La tâche en tant qu'élément constitutif de l'ECS peut être arrêtée par StopTask appel. Le service est composé de tâches sous-jacentes qui peuvent être arrêtées par le même appel API. La seule partie manquante ici est le foreach autour des résultats de Liste des tâches avec un appel défini famille paramètre. J'ai écrit un simple Fonction lambda qui peut vous aider dans cette tâche.

2voto

user522767 Points 888

Je développe la réponse de @user326608 ci-dessus (merci pour l'éclairage !).

Cette opération redémarre TOUTES LES TÂCHES DE TOUS LES SERVICES D'UN CLUSTER en arrêtant toutes ses tâches. Chaque service lancera alors automatiquement X le nombre de nouvelles tâches, où X est le desired task count .

#!/bin/bash

index=0
taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)

until [ "$taskArn" = "None" ]
do 
  aws ecs stop-task --cluster ${CLUSTER_NAME} --task $taskArn
  ((index++))
  taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)
done

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