Temos uma tarefa que carrega alguns arquivos de configuração de uma fonte de dados externa. Após o upload das configurações, 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?
Temos uma 'solução alternativa' que envolve definir o 'número de tarefas' como 0 e fazer backup, mas definitivamente não é assim que deve ser feito e tem tempo de inatividade.
amazon-web-services
docker
amazon-ecs
Dennkster
fonte
fonte
Respostas:
Usando a ferramenta CLI da AWS:
fonte
O que você quer fazer é essencialmente o mesmo que reimplementar o Serviço.
Para reimplementar o serviço sem tempo de inatividade:
Isso deve iniciar novas tarefas para a nova definição de tarefa e, em seguida, eliminar as antigas tarefas para a antiga definição de tarefa, reiniciando efetivamente as tarefas sem tempo de inatividade.
Consulte: UpdateService
fonte
isso funcionou para mim:
as tarefas são recriadas nas mesmas instâncias.
se você precisar de novas instâncias, use o seguinte:
fonte
A tarefa como componente básico do ECS pode ser interrompida pela chamada StopTask . O serviço é composto de tarefas subjacentes que podem ser interrompidas com a mesma chamada de API. Somente a parte que falta aqui é foreach em torno dos resultados da chamada ListTasks com parâmetro de família definido Eu escrevi a função Lambda simples que pode ajudá-lo com isso.
fonte
Estou expandindo a resposta de @ user326608 acima (obrigado pela compreensão!).
Isso reiniciará TODAS AS TAREFAS DE TODOS OS SERVIÇOS DE UM CLUSTER , interrompendo todas as suas tarefas. Cada serviço iniciará automaticamente o
X
número de novas tarefas, ondeX
está o serviçodesired task count
.fonte
Com base na documentação da Amazon, parece que você deve conseguir criar um script das operações em questão usando as chamadas da API UpdateService . Existem alguns exemplos de código disponíveis no link anterior, parece possível que você possa se adaptar. Parece que escrever um script para recarregar os serviços usando a definição de tarefa apropriada após as atualizações nas configurações da tarefa seria a solução mais elegante para o problema.
Há mais documentação sobre o uso da CLI da AWS com ECS, que parece ser a maneira mais fácil de lidar com scripts em lote e a reinicialização de serviços.
fonte
Funciona muito bem https://github.com/fdfk/ecsServiceRestart
fonte
Eu tenho trabalhado nisso. Seria útil poder reiniciar uma tarefa por vez de maneira confiável. O script abaixo é o que estou usando agora. É muito cauteloso. Requer que você aperte return para cada tarefa. Há um comando para aguardar o serviço ser estável, mas isso não significa que a tarefa esteja íntegra. E eu poderia colocar um atraso de tempo. Mas, no final, se tudo der errado, o script acabaria matando o aplicativo lentamente. Então...
fonte
Eu tenho um script python boto3 que faz o ff:
ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')
ecs_client.stop_task(cluster=mycluster,task=mytask)
ecs_client.describe_services(cluster=mycluster,services=[myservice])
while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:
Se o loop while não for mais verdadeiro - o que significa que as contagens de execução e desejada são iguais, pare a próxima tarefa na lista.
Esse é o fluxo real e não consigo mostrar o código real, pois ainda estou empregado no meu trabalho atual e todo o meu código pertence a eles :)
fonte