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

17

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

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

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

Dennkster
источник
PS: Если бы кто-то мог создать тег amazon-ecs, это было бы здорово :)
Dennkster
Хороший звонок на тег, я добавил его для тебя.
ceejayoz
Описывает ли этот документ от Amazon обходной путь, который вы используете в настоящее время?
Мэтт

Ответы:

15

Использование инструмента AWS CLI:

aws ecs update-service --force-new-deployment --service my-service
Бен Уэйли
источник
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
user326608
источник
Этот второй, кажется, делает что-то иное, чем запуск новых экземпляров.
user130681
2

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

s7anley
источник
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, которая, кажется, будет самым простым способом справиться с пакетным сценарием при перезапуске сервисов.

Matt
источник
Я могу работать над написанием и публикацией последовательности сценария / команды, но в настоящее время у меня нет доступа к учетной записи 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
user130681
источник
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 больше не является истинным - это означает, что и количество выполняемых, и желаемых счетчиков равны, остановите следующую задачу в списке.

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

pnocti
источник