Amazon ECS - Bir Hizmetin Tüm Görevlerini nasıl yeniden başlatırsınız?


18

Harici bir veri kaynağından bazı yapılandırma dosyalarını yükleyen bir görevimiz var. Ayarlar yüklendikten sonra, bir hizmetteki tüm görevleri yeniden başlatabiliriz, böylece ayarlar tüm örneklere yayılır.

Tüm hizmetleri yeniden başlatmanın en iyi yolu nedir?

'Görev sayısı'nın 0 olarak ayarlanmasını ve ardından yedeklenmesini içeren bir' geçici çözümümüz 'var, ancak bu kesinlikle yapılması gereken ve kesinti süresi değil.


Not: Birisi harika olurdu amazon-
ecs

Etiketi iyi ara, senin için ekledim.
ceejayoz

Amazon'un bu belgesi şu anda kullandığınız geçici çözümü açıklıyor mu?
Matt

Yanıtlar:


17

AWS CLI aracını kullanarak:

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

9

Yapmak istediğiniz şey aslında Hizmeti yeniden dağıtmakla aynı şeydir.

Hizmeti kesinti olmadan yeniden konuşlandırmak için:

  1. Mevcut Görev Tanımı'na dayalı yeni bir Görev Tanımı kaydedin (aynı ayrıntılarla)
  2. Varolan Hizmeti yeni Görev Tanımı ile ilişkilendirerek UpdateService'i arayın.

Bu, yeni Görev Tanımı için yeni Görevler başlatmalı ve ardından eski Görev Tanımı için eski Görevleri öldürmeli ve görevleri kesinti olmadan etkili bir şekilde yeniden başlatmalıdır.

Bakınız: UpdateService


1
Bunu AWS Konsolu aracılığıyla yapmam gerekiyordu ve bu en kolay yol - gerekirse tüm işlemi manuel olarak yönetebilirsiniz. Tüm görevleri hızlı bir şekilde yeniden başlatmanız ve süreç için daha sağlam bir şey ayarlamamanız gerektiğinde yararlıdır - kullanıcı arayüzünde Görev tanımına gidin, yeni bir düzeltme oluşturun, hizmeti güncelleyin, ardından kısa bir süre sonra Görevler yeniden başlatıldı!
geerlingguy

2
Hizmet güncellemesine "Yeni dağıtımı zorla" işleminize 1. adımı atlamanızı sağlayan bir onay kutusu eklediler.
Josh Vickery

"Yeni konuşlandırmayı zorlar" seçeneğiyle ilgili yorum kendim için Kabul Edilen Yanıt'dı.
ecbrodie

3

bu benim için çalıştı:

aws ecs list-tasks --cluster <cluster_name> | jq -r ".taskArns[]" | awk '{print "aws ecs stop-task --cluster <cluster_name> --task \""$0"\""}' | sh

görevler daha sonra aynı örneklerde yeniden oluşturulur.

yeni örneklere ihtiyacınız varsa, bunu kullanın:

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

İkincisi yeni örneklere başlamaktan başka bir şey yapıyor gibi görünüyor.
user130681

2

ECS'nin yapı taşı olarak görev StopTask çağrısı ile durdurulabilir . Hizmet, aynı API çağrısı ile durdurulabilecek temel görevlerden oluşur. Burada sadece eksik kısım , tanımlanmış aile parametresi ile ListTasks çağrısından gelen sonuçların öngörüldür . Bu konuda size yardımcı olabilecek basit Lambda fonksiyonu yazdım .


1

Yukarıdaki @ user326608 yanıtını genişletiyorum (içgörü için teşekkürler!).

Bu, bir KÜMESİN TÜM HİZMETLERİ İÇİN TÜM GÖREVLERİ tüm görevlerini durdurarak yeniden başlatacaktır . Her hizmet otomatik olarak başlatacak Xyeni görevler, sayısını Xhizmeti en olduğunu 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

Not: Tek bir hizmet için görevleri yeniden başlatmak istiyorsanız, @Ben Whaley'in açıkladığı gibi yeni bir dağıtımı zorlamanız yeterlidir.
sudo soul

0

Amazon belgelerine dayanarak, söz konusu işlemleri UpdateService API çağrılarını kullanarak komut dosyası yazabilmeniz gerekir . Önceki bağlantıda bazı kod örnekleri var, uyum sağlayabilmeniz mümkün görünüyor. Görev yapılandırmalarındaki güncellemeler sorunun en şık çözümü olacağından, uygun görev tanımını kullanarak hizmetleri yeniden yüklemeye özen göstermek için bir komut dosyası yazmak gibi görünüyor.

AWS CLI'yi ECS ile kullanma hakkında daha fazla belge var ve bu, hizmetlerin yeniden başlatılmasını toplu komut dosyasıyla başa çıkmanın en kolay yolu gibi görünüyor.


Komut dosyası / komut dizisi yazma ve gönderme üzerinde çalışabilirim ama şu anda bu tür bir şeyi test etmek için kullanabileceğim bir AWS hesabına erişimim yok, bu yüzden kaba bir taslak / başlangıç ​​noktası olacağım çünkü etkili bir şekilde test edebilmek ...
Matt


0

Ben bunun üzerinde çalışıyorum. Bir görevi bir seferde güvenilir bir şekilde yeniden başlatabilmek oldukça yararlı olacaktır. Aşağıdaki senaryo şu anda kullandığım. Oldukça ihtiyatlı. Her görev için geri dönüş yapmanızı gerektirir. Hizmetin kararlı olmasını beklemek için bir komut vardır, ancak bu, görevin sağlıklı olduğu anlamına gelmez. Ve zaman gecikmesi koyabilirim. Ama sonunda işler kötüye giderse, senaryo uygulamayı yavaşça öldürür. Yani...

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

Ff yapan bir python boto3 komut dosyası var:

  1. üzerinden bir hizmet için 'ÇALIŞIYOR' durumundaki görevlerin bir listesini oluşturun

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

  1. yukarıdaki görevlerin listesi için bir for döngüsü yapın ve her birini

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

  1. runningCount ve desiredCount'u almak için hizmeti tanımlayın

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

  1. while loop if runningCount <desiredCount - yani bir görev şu anda durdurulmakta ve henüz değiştirilmemiştir, bu yüzden bir sonraki görevi henüz durdurmayın!

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

While döngüsü artık doğru değilse - hem çalışan hem de istenen sayım eşitse, listedeki bir sonraki görevi durdurun.

Bu gerçek akış ve hala geçerli işim tarafından istihdam ve tüm kod onlara ait olduğu gibi gerçek kodu gösteremiyorum :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.