Amazon ECS - คุณจะเริ่มงานบริการทั้งหมดได้อย่างไร


18

เรามีงานที่โหลดไฟล์การกำหนดค่าบางอย่างจากแหล่งข้อมูลภายนอก หลังจากอัปโหลดการตั้งค่าแล้วเราต้องการที่จะสามารถเริ่มต้นภารกิจทั้งหมดในบริการเพื่อให้การตั้งค่าแพร่กระจายไปยังอินสแตนซ์ทั้งหมด

วิธีที่ดีที่สุดในการเริ่มบริการทั้งหมดใหม่คืออะไร

เรามี 'วิธีแก้ปัญหา' ที่เกี่ยวข้องกับการตั้งค่า 'จำนวนงาน' เป็น 0 แล้วสำรองข้อมูล แต่นี่ไม่ใช่วิธีที่ควรทำและมีการหยุดทำงาน


PS: ถ้ามีคนสามารถสร้างแท็ก Amazon-ECS ว่าจะดี :)
Dennkster

โทรดีที่แท็กฉันเพิ่มมันสำหรับยา
ceejayoz

เอกสารนี้จาก Amazonอธิบายวิธีแก้ปัญหาที่คุณใช้อยู่หรือไม่?
Matt

คำตอบ:



9

สิ่งที่คุณต้องการทำคือการปรับใช้บริการซ้ำอีกครั้ง

ในการปรับใช้บริการใหม่โดยไม่ต้องหยุดทำงาน

  1. ลงทะเบียนนิยามภารกิจใหม่โดยยึดตามนิยามภารกิจปัจจุบัน (โดยมีรายละเอียดเหมือนกัน)
  2. โทร UpdateService เชื่อมโยงบริการที่มีอยู่กับข้อกำหนดของงานใหม่

การดำเนินการนี้ควรเปิดใช้งานใหม่สำหรับคำนิยามงานใหม่แล้วฆ่างานเก่าสำหรับคำนิยามงานเก่าโดยเริ่มต้นภารกิจใหม่อย่างมีประสิทธิภาพโดยไม่ต้องหยุดทำงาน

โปรดดู: UpdateService


1
ฉันต้องทำสิ่งนี้ผ่านคอนโซล AWS และนี่เป็นวิธีที่ง่ายที่สุด - คุณสามารถจัดการกระบวนการทั้งหมดได้ด้วยตนเองหากคุณต้องการ มีประโยชน์เมื่อคุณต้องการเปิดใช้งานใหม่อย่างรวดเร็วและไม่ต้องมีสิ่งใดที่แข็งแกร่งกว่าสำหรับการตั้งค่า - ใน UI ไปที่คำจำกัดความของงานสร้างการแก้ไขใหม่อัปเดตบริการแล้วหลังจากนั้นเล็กน้อย มีการเปิดใช้งานใหม่!
geerlingguy

2
พวกเขาได้เพิ่มช่องทำเครื่องหมายในอัปเดตบริการ "บังคับใช้งานใหม่" ซึ่งช่วยให้คุณข้ามขั้นตอนที่ 1 ในกระบวนการของคุณ
Josh Vickery

ความคิดเห็นเกี่ยวกับตัวเลือก "บังคับใช้การปรับใช้ใหม่" คือคำตอบที่ยอมรับสำหรับตัวฉันเอง
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

คนที่สองดูเหมือนว่าจะทำอย่างอื่นที่ไม่ใช่การเริ่มต้นอินสแตนซ์ใหม่
user130681

2

งานในแบบ Building Block ของ ECS สามารถหยุดได้โดยการเรียกStopTask บริการประกอบด้วยงานพื้นฐานซึ่งอาจถูกหยุดด้วยการเรียก API เดียวกัน ส่วนที่ขาดหายไปเท่านั้นที่นี่คือ foreach รอบผลลัพธ์จากการโทรListTasksด้วยพารามิเตอร์ครอบครัวที่กำหนด ฉันเขียนฟังก์ชัน Lambdaง่าย ๆซึ่งสามารถช่วยคุณได้


1

ฉันกำลังขยายคำตอบของ @ user326608 ด้านบน (ขอบคุณสำหรับข้อมูลเชิงลึก!)

สิ่งนี้จะรีสตาร์ทงานทั้งหมดสำหรับบริการทั้งหมดสำหรับกลุ่มโดยหยุดงานทั้งหมด บริการแต่ละคนจะแล้วโดยอัตโนมัติเปิดตัวXจำนวนของงานใหม่ที่เป็นบริการXdesired 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 ดูเหมือนว่าคุณควรจะสามารถสคริปต์การดำเนินงานในคำถามโดยใช้สาย UpdateService API มีตัวอย่างโค้ดบางส่วนที่ลิงค์ก่อนหน้านี้ดูเหมือนว่าเป็นไปได้ที่คุณควรจะปรับตัว ดูเหมือนว่าการเขียนสคริปต์เพื่อดูแลการโหลดบริการโดยใช้คำนิยามงานที่เหมาะสมหลังจากการปรับปรุงการกำหนดค่างานจะเป็นทางออกที่ดีที่สุดสำหรับปัญหา

มีเอกสารเพิ่มเติมเกี่ยวกับการใช้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. สร้างรายการงานที่มีสถานะ 'RUNNING' สำหรับบริการผ่าน

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

  1. ทำ for for loop สำหรับรายการงานด้านบนและหยุดแต่ละงานผ่าน

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

  1. อธิบายบริการเพื่อรับ runningCount และต้องการ Count

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

  1. ในขณะที่วนลูปถ้า runCount <ที่ต้องการนับ - หมายถึงงานกำลังหยุดและยังไม่ถูกแทนที่ดังนั้นอย่าหยุดงานต่อไป!

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

ถ้าห่วงวนรอบในขณะนั้นไม่เป็นจริงอีกต่อไป - หมายถึงทั้งจำนวนการเรียกใช้และจำนวนที่ต้องการให้หยุดงานถัดไปในรายการ

นี่คือโฟลว์ที่เกิดขึ้นจริงและฉันไม่สามารถแสดงรหัสที่แท้จริงได้เนื่องจากฉันยังคงทำงานในงานปัจจุบันของฉันและรหัสทั้งหมดของฉันเป็นของพวกเขา :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.