Amazon ECS - як перезапустити всі завдання служби?


18

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

Який найкращий спосіб перезапустити всі сервіси?

У нас є "вирішення", яке передбачає встановлення "кількості завдань" на 0, а потім резервного копіювання, але це, безумовно, не так, як це слід робити та має час простою.


PS: Якби хтось міг створити тег amazon-ecs, це було б чудово :)
Dennkster

Гарний дзвінок на тезі, я додав його для вас.
ceejayoz

Чи пояснює цей документ від Amazon обхідне рішення, яке ви зараз використовуєте?
Метт

Відповіді:


16

Використання інструменту AWS CLI:

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

9

Те, що ви хочете зробити, по суті те саме, що перерозподілити Сервіс.

Щоб перерозподілити послугу без простоїв:

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

Це має запустити нові завдання для нового визначення завдання, а потім знищити старі завдання для старого визначення завдання, ефективно перезапустивши завдання без простоїв.

Див.: UpdateService


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

2
Вони додали прапорець до оновлення служби "Примусити нове розгортання", що дозволяє пропустити крок 1 у вашому процесі.
Джош Вікері

Коментар щодо параметра "Сили нового розгортання" був прийнятим для себе відповіддю.
ecbrodie

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

Цей другий, здається, робить щось інше, ніж запускати нові екземпляри.
користувач130681

2

Завдання як складовий блок ECS можна зупинити викликом StopTask . Сервіс складається з основних завдань, які можуть бути зупинені одним і тим самим викликом API. Лише відсутня частина тут є передбаченням результатів виклику 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

Я над цим працював. Було б дуже корисно мати можливість надійно перезапустити одне завдання за один раз. Сценарій нижче - це те, що я зараз використовую. Це досить обережно. Потрібно, щоб ви повернулися для кожного завдання. Є команда чекати, коли служба буде стабільною, але це не означає, що завдання є здоровим. І я міг би поставити затримку в часі. Але врешті-решт, якщо все піде погано, сценарій просто повільно знищить додаток. Тому...

#!/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 для списку завдань, описаних вище, і зупиніть кожну програму via

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

  1. опишіть службу, щоб отримати RunCount та бажанийCount

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

  1. при цьому цикл, якщо runCount <desireCount - означає, що завдання наразі зупинено і ще не замінено, тому не зупиняйте наступне завдання ще!

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

Якщо цикл while вже не відповідає дійсності - значить, і кількість запущених, і бажаних підрахунків рівні, зупиніть наступне завдання у списку.

Це фактичний потік, і я не в змозі показати фактичний код, оскільки я все ще працюю на своїй поточній роботі, і весь мій код належить їм :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.