Amazon ECS - Como você reinicia todas as tarefas de um serviço?

7

Temos uma tarefa que carrega alguns arquivos de configuração de uma fonte de dados externa. Depois que as configurações forem carregadas, gostaríamos de poder reiniciar todas as tarefas em um serviço para que as configurações sejam propagadas para todas as instâncias.

Qual é a melhor maneira de reiniciar todos os serviços?

Nós temos uma 'solução alternativa' que envolve definir o 'número de tarefas' como 0 e depois fazer o backup, mas definitivamente não é assim que deve ser feito e tem tempo de inatividade.

    
por Dennkster 14.07.2015 / 16:49

7 respostas

4

O que você deseja fazer é essencialmente o mesmo que reimplementar o Serviço.

Para reimplementar o serviço sem tempo de inatividade:

  1. Registrar uma nova Definição de tarefa com base na tarefa atual Definição (com os mesmos detalhes)
  2. Ligue para UpdateService, associando o Serviço existente ao nova definição de tarefas.

Isso deve ativar novas Tarefas para a nova Definição de Tarefas e, em seguida, eliminar as Tarefas antigas da Definição de Tarefa antiga, efetivamente reiniciando as tarefas sem tempo de inatividade.

Veja: UpdateService

    
por 15.07.2015 / 13:20
2

A tarefa como bloco de construção do ECS pode ser interrompida por uma chamada StopTask . O serviço é composto de tarefas subjacentes que podem ser interrompidas com a mesma chamada de API. Só faltando aqui parte é foreach em torno de resultados de ListTasks chamada com definida family . Eu escrevi uma função Lambda que pode ajudá-lo com isso.

    
por 07.04.2016 / 20:27
1

Usando a ferramenta AWS CLI:

aws ecs update-service --force-new-deployment --service my-service
    
por 23.05.2018 / 23:19
1

isso funcionou para mim:

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

as tarefas são recriadas nas mesmas instâncias.

se você precisar de novas instâncias, use:

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
    
por 08.07.2018 / 09:01
0

Com base na documentação da Amazon, parece que você deve conseguir fazer o script das operações em questão usando o Chamadas de API do UpdateService . Existem alguns exemplos de código disponíveis no link anterior, parece possível que você seja capaz de se adaptar. Parece que escrever um script para cuidar de recarregar os serviços usando a definição de tarefa apropriada depois que as atualizações nas configurações de tarefas seriam a solução mais elegante para o problema.

Há mais documentação sobre como usar o AWS CLI com ECS , que parece que seria ser a maneira mais fácil de lidar com o script em lote do reinício de serviços.

    
por 14.07.2015 / 18:09
0

Funciona bem no link

python ecsServiceRestart.py restart --services="app app2" --cluster=test
    
por 14.08.2017 / 11:14
0

Eu tenho trabalhado nisso. Seria bastante útil ser capaz de reiniciar uma tarefa de cada vez de forma confiável. O script abaixo é o que estou usando agora. É muito cauteloso. Requer que você aperte o retorno para cada tarefa. Existe um comando para esperar que o serviço seja estável, mas isso não significa que a tarefa esteja íntegra. E eu poderia colocar um atraso no tempo. Mas no final, se as coisas estão indo mal, o script seria apenas lentamente matar o aplicativo. Então ...

#!/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
    
por 10.11.2018 / 10:36