Назад | Перейти на главную страницу

Amazon ECS - как перезапустить все задачи службы?

У нас есть задача, которая загружает некоторые файлы конфигурации из внешнего источника данных. После загрузки настроек мы хотели бы иметь возможность перезапустить все задачи в сервисе, чтобы настройки распространялись на все экземпляры.

Как лучше всего перезапустить все службы?

У нас есть «обходной путь», который включает в себя установку «количества задач» на 0 и последующее резервное копирование, но это определенно не то, как это должно быть сделано, и имеет время простоя.

С помощью инструмента AWS CLI:

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

То, что вы хотите сделать, по сути то же самое, что и повторно развернуть Службу.

Чтобы повторно развернуть службу без простоя:

  1. Зарегистрируйте новое определение задачи на основе текущего определения задачи (с теми же деталями)
  2. Вызовите UpdateService, связывая существующую службу с новым определением задачи.

Это должно запустить новые задачи для нового определения задачи, а затем уничтожить старые задачи для старого определения задачи, эффективно перезапустив задачи без простоя.

Видеть: 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:

  1. создать список задач со статусом «РАБОТАЕТ» для сервиса через

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

  1. выполните цикл for для списка задач выше и остановите каждую через

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

  1. описать службу, чтобы получить runningCount и desireCount

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

  1. цикл while, если runningCount <желаемоеCount - это означает, что задача в настоящее время остановлена ​​и еще не заменена, поэтому не останавливайте следующую задачу!

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

Если цикл while больше не соответствует истине - это означает, что и запущенный, и желаемый счетчики равны, остановите следующую задачу в списке.

Это реальный поток, и я не могу показать реальный код, поскольку я все еще занят на моей текущей работе, и весь мой код принадлежит им :)