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


17

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

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

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


PS: Если бы кто-то мог создать тег amazon-ecs, это было бы здорово :)
Dennkster

Хороший звонок на тег, я добавил его для тебя.
ceejayoz

Описывает ли этот документ от Amazon обходной путь, который вы используете в настоящее время?
Мэтт

Ответы:



8

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

Для повторного развертывания службы без простоя:

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

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

Смотрите: UpdateService


1
Мне нужно было сделать это через Консоль AWS, и это самый простой способ - вы можете управлять всем процессом вручную, если вам нужно. Полезно, когда вам нужно быстро перезапустить все задачи и у вас нет более надежной настройки для процесса - в пользовательском интерфейсе перейдите к определению задачи, создайте новую ревизию, обновите службу, а затем через некоторое время все Задачи возобновлены!
geerlingguy

2
Они добавили флажок в обновление службы «Принудительное новое развертывание», который позволяет пропустить шаг 1 в процессе.
Джош Викери

Комментарий о параметре «Принудительное новое развертывание» был «Принятый ответ» для меня.
Экброди

3

это сработало для меня:

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

Этот второй, кажется, делает что-то иное, чем запуск новых экземпляров.
user130681

2

Задача как строительный блок ECS может быть остановлена вызовом StopTask . Сервис состоит из базовых задач, которые могут быть остановлены одним и тем же вызовом API. Единственная недостающая часть здесь - это foreach вокруг результатов вызова ListTasks с определенным параметром семейства . Я написал простую лямбда-функцию, которая может помочь вам в этом.


1

Я расширяю ответ @ 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

Примечание. Если вы хотите перезапустить задачи для одной службы, просто запустите новое развертывание, как описано в @Ben Whaley.
sudo soul

0

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

Существует больше документации по использованию AWS CLI с ECS, которая, кажется, будет самым простым способом справиться с пакетным сценарием при перезапуске сервисов.


Я могу работать над написанием и публикацией последовательности сценария / команды, но в настоящее время у меня нет доступа к учетной записи AWS, которую я мог бы использовать для тестирования такого рода вещей, так что это был бы грубый набросок / отправная точка, поскольку я бы не стал быть в состоянии эффективно проверить это ...
Мэтт


0

Я работал над этим. Было бы очень полезно иметь возможность перезапускать одну задачу одновременно. Сценарий ниже - это то, что я сейчас использую. Это довольно осторожно. Требуется, чтобы вы нажали «Return» за каждую задачу. Существует команда для ожидания стабильности службы, но это не означает, что задача работоспособна. И я мог бы поставить задержку. Но в конце концов, если дела пойдут плохо, скрипт просто медленно убьет приложение. Так...

#!/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

0

У меня есть скрипт 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 и требуемыйCount

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.