Amazon ECS - Bagaimana Anda me-restart semua Tugas Layanan?

16

Kami memiliki tugas yang memuat beberapa file konfigurasi dari sumber data eksternal. Setelah pengaturan diunggah, kami ingin dapat memulai kembali semua tugas dalam layanan sehingga pengaturan menyebar ke semua instance.

Apa cara terbaik untuk me-restart semua layanan?

Kami memiliki 'solusi' yang melibatkan pengaturan 'jumlah tugas' menjadi 0 dan kemudian dicadangkan, tetapi ini jelas bukan cara yang seharusnya dilakukan dan memiliki waktu henti.

Dennkster
sumber
PS: Jika seseorang dapat membuat tag amazon-ecs itu akan menjadi luar biasa :)
Dennkster
Panggilan yang baik pada tag, saya menambahkannya untuk Anda.
ceejayoz
Apakah dokumen dari Amazon ini menjelaskan solusi yang sedang Anda gunakan?
Matt

Jawaban:

15

Menggunakan alat AWS CLI:

aws ecs update-service --force-new-deployment --service my-service
Ben Whaley
sumber
7

Apa yang ingin Anda lakukan pada dasarnya sama dengan mempekerjakan kembali Layanan.

Untuk menggunakan kembali layanan tanpa downtime:

  1. Daftarkan Definisi Tugas baru berdasarkan pada Definisi Tugas saat ini (dengan detail yang sama)
  2. Panggil UpdateService, mengaitkan Layanan yang ada dengan Definisi Tugas baru.

Ini akan meluncurkan Tugas baru untuk Definisi Tugas baru dan kemudian membunuh Tugas lama untuk Definisi Tugas lama, secara efektif memulai kembali tugas tanpa downtime.

Lihat: Pembaruan Layanan

Matt Callanan
sumber
1
Saya perlu melakukan ini melalui Konsol AWS, dan ini adalah cara termudah — Anda dapat mengelola seluruh proses secara manual jika perlu. Bermanfaat ketika Anda perlu meluncurkan kembali semua tugas dengan cepat dan tidak memiliki pengaturan yang lebih kuat untuk proses - di UI, buka definisi Tugas, buat revisi baru, perbarui layanan, lalu setelah beberapa saat semua Tugas diluncurkan kembali!
geerlingguy
2
Mereka telah menambahkan kotak centang ke pembaruan layanan "Force new deployment" yang memungkinkan Anda melewati langkah 1 dalam proses Anda.
Josh Vickery
Komentar tentang opsi "Pasukan penyebaran baru" adalah Jawaban yang Diterima untuk saya sendiri.
ecbrodie
3

ini bekerja untuk saya:

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

tugas-tugas kemudian buat kembali pada contoh yang sama.

jika Anda membutuhkan contoh baru, gunakan ini:

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
pengguna326608
sumber
Yang kedua tampaknya melakukan sesuatu selain memulai contoh baru.
user130681
2

Tugas sebagai blok bangunan ECS dapat dihentikan dengan panggilan StopTask . Layanan terdiri dari tugas-tugas mendasar yang dapat dihentikan dengan panggilan API yang sama. Hanya bagian yang hilang di sini yang melihat hasil dari panggilan ListTasks dengan parameter keluarga yang ditentukan. Saya menulis fungsi Lambda sederhana yang dapat membantu Anda dengan ini.

s7anley
sumber
1

Saya memperluas jawaban @ user326608 di atas (terima kasih atas wawasannya!).

Ini akan memulai kembali SEMUA TUGAS UNTUK SEMUA LAYANAN UNTUK KLUSTER dengan menghentikan semua tugasnya. Setiap layanan kemudian akan secara otomatis meluncurkan Xsejumlah tugas baru, di mana Xlayanan itu 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
sudo soul
sumber
Catatan: Jika Anda ingin memulai kembali tugas untuk satu layanan, cukup paksakan penyebaran baru seperti yang dijelaskan oleh @Ben Whaley.
sudo soul
0

Berdasarkan dokumentasi Amazon sepertinya Anda harus dapat skrip operasi yang bersangkutan menggunakan panggilan API UpdateService . Ada beberapa contoh kode yang tersedia di tautan sebelumnya, mungkin Anda dapat beradaptasi. Sepertinya menulis skrip untuk menangani reload layanan menggunakan definisi tugas yang sesuai setelah pembaruan konfigurasi tugas akan menjadi solusi paling elegan untuk masalah ini.

Ada lebih banyak dokumentasi tentang menggunakan AWS CLI dengan ECS yang sepertinya itu akan menjadi cara termudah untuk menangani batch scripting untuk memulai kembali layanan.

Mat
sumber
Saya dapat bekerja menulis dan memposting urutan skrip / perintah tetapi saat ini saya tidak memiliki akses ke akun AWS yang dapat saya gunakan untuk menguji hal semacam ini, jadi itu akan menjadi konsep awal / titik awal karena saya tidak akan dapat mengujinya secara efektif ...
Matt
0

Saya telah mengerjakan ini. Akan sangat berguna untuk dapat memulai kembali satu tugas secara andal. Script di bawah ini adalah apa yang saya gunakan sekarang. Ini cukup hati-hati. Membutuhkan Anda menekan pengembalian untuk setiap tugas. Ada perintah untuk menunggu agar layanan stabil, tetapi itu tidak berarti bahwa tugas itu sehat. Dan saya bisa menunda waktu. Tetapi pada akhirnya jika semuanya memburuk, skrip akan perlahan-lahan mematikan aplikasi. Begitu...

#!/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
pengguna130681
sumber
0

Saya memiliki skrip python boto3 yang berfungsi sebagai ff:

  1. buat daftar tugas dengan status 'RUNNING' untuk layanan melalui

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

  1. lakukan perulangan for untuk daftar tugas di atas dan berhenti masing-masing melalui

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

  1. menggambarkan layanan untuk mendapatkan runningCount dan diinginkanCount

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

  1. sementara loop jika menjalankanCount <diinginkanCount - artinya tugas sedang dihentikan dan belum diganti, jadi jangan berhenti tugas berikutnya!

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

Jika loop sementara tidak benar lagi - artinya jumlah yang berjalan dan yang diinginkan sama, hentikan tugas berikutnya dalam daftar.

Ini adalah aliran aktual dan saya tidak dapat menampilkan kode yang sebenarnya karena saya masih dipekerjakan oleh pekerjaan saya saat ini dan semua kode saya milik mereka :)

pnocti
sumber