У нас есть задача, которая загружает некоторые файлы конфигурации из внешнего источника данных. После загрузки настроек мы хотели бы иметь возможность перезапустить все задачи в сервисе, чтобы настройки распространялись на все экземпляры.
Как лучше всего перезапустить все службы?
У нас есть «обходной путь», который включает в себя установку «количества задач» на 0 и последующее резервное копирование, но это определенно не то, как это должно быть сделано, и имеет время простоя.
С помощью инструмента AWS CLI:
aws ecs update-service --force-new-deployment --service my-service
То, что вы хотите сделать, по сути то же самое, что и повторно развернуть Службу.
Чтобы повторно развернуть службу без простоя:
Это должно запустить новые задачи для нового определения задачи, а затем уничтожить старые задачи для старого определения задачи, эффективно перезапустив задачи без простоя.
Видеть: UpdateService
это сработало для меня:
aws ecs list-tasks --cluster <cluster_name> | jq -r ".taskArns[]" | awk '{print "aws ecs stop-task --cluster <cluster_name> --task \""$0"\""}' | sh
затем задачи воссоздаются на тех же экземплярах.
если вам нужны новые экземпляры, используйте это:
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
Задача как строительный блок ECS может быть остановлена StopTask вызов. Сервис состоит из базовых задач, которые можно остановить одним и тем же вызовом API. Единственная недостающая часть здесь - это foreach вокруг результатов из ListTasks позвонить с определенным семья параметр. Я написал просто Лямбда-функция который может вам в этом помочь.
Я расширяю ответ @ user326608 выше (спасибо за понимание!).
Это перезапустится ВСЕ ЗАДАЧИ ДЛЯ ВСЕХ УСЛУГ ДЛЯ КЛАСТЕРА остановив все свои задачи. После этого каждая служба запускается автоматически X
количество новых задач, где X
это служба 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
Судя по документации Amazon, кажется, что у вас должна быть возможность создавать сценарии для рассматриваемых операций с помощью Вызовы API UpdateService. По предыдущей ссылке есть несколько примеров кода, возможно, вы сможете адаптироваться. Похоже, что написание сценария, который позаботится о перезагрузке служб с использованием соответствующего определения задачи после обновления конфигураций задач, будет наиболее элегантным решением проблемы.
Есть дополнительная документация по использованию AWS CLI с ECS Кажется, это был бы самый простой способ справиться с пакетным сценарием перезапуска служб.
Прекрасно работает https://github.com/fdfk/ecsServiceRestart
python ecsServiceRestart.py restart --services="app app2" --cluster=test
Я работал над этим. Было бы очень полезно иметь возможность надежно перезапускать одну задачу за раз. Приведенный ниже сценарий - это то, что я использую сейчас. Это довольно осторожно. Требует возврата для каждой задачи. Есть команда дождаться стабилизации службы, но это не означает, что задача исправна. И я мог поставить задержку. Но в конце концов, если что-то пойдет не так, скрипт просто медленно убьет приложение. Так...
#!/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
У меня есть скрипт python boto3, который выполняет 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']:
Если цикл while больше не соответствует истине - это означает, что и запущенный, и желаемый счетчики равны, остановите следующую задачу в списке.
Это реальный поток, и я не могу показать реальный код, поскольку я все еще занят на моей текущей работе, и весь мой код принадлежит им :)