Amazon ECS - आप किसी सेवा के सभी कार्य कैसे पुनः आरंभ करते हैं?


18

हमारे पास एक कार्य है जो बाहरी डेटा स्रोत से कुछ कॉन्फ़िगरेशन फ़ाइलों को लोड करता है। सेटिंग्स अपलोड होने के बाद हम एक सेवा में सभी कार्यों को फिर से शुरू करने में सक्षम होना चाहते हैं ताकि सेटिंग्स सभी उदाहरणों के लिए प्रचारित हो सकें।

सभी सेवाओं को पुनः आरंभ करने का सबसे अच्छा तरीका क्या है?

हमारे पास एक 'वर्कअराउंड' है जिसमें 'कार्यों की संख्या' को 0 पर सेट करना और फिर बैकअप करना शामिल है, लेकिन यह निश्चित रूप से नहीं है कि इसे कैसे करना चाहिए और डाउनटाइम है।


पुनश्च: यदि कोई ऐसा टैग बना सकता है जो
अमेज़ॅन

टैग पर अच्छा कॉल, मैंने इसे फिर से जोड़ा।
सिजयोज़

क्या अमेज़ॅन का यह दस्तावेज़ उस वर्कअराउंड की व्याख्या करता है जिसे आप वर्तमान में उपयोग कर रहे हैं?
मैट

जवाबों:



9

आप जो करना चाहते हैं वह अनिवार्य रूप से सेवा को फिर से तैयार करने जैसा है।

डाउनटाइम के बिना सेवा को फिर से तैयार करने के लिए:

  1. वर्तमान टास्क डेफिनिशन (उसी विवरण के साथ) के आधार पर एक नई कार्य परिभाषा दर्ज करें
  2. अपडेट सेवा को कॉल करें, मौजूदा सेवा को नई टास्क परिभाषा के साथ जोड़ दें।

यह नए टास्क डेफिनिशन के लिए नए टास्क को लॉन्च करना चाहिए और फिर पुराने टास्क डेफिनिशन के लिए पुराने टास्क को मारना चाहिए, प्रभावी रूप से डाउनटाइम के बिना कार्यों को फिर से शुरू करना।

देखें: अद्यतन सेवा


1
मुझे एडब्ल्यूएस कंसोल के माध्यम से ऐसा करने की आवश्यकता थी, और यह सबसे आसान तरीका है - यदि आपको ज़रूरत है तो आप पूरी प्रक्रिया को मैन्युअल रूप से प्रबंधित कर सकते हैं। मददगार जब आपको सभी कार्यों को जल्दी से करने की आवश्यकता होती है और प्रक्रिया के लिए कुछ और अधिक मजबूत नहीं होता है - यूआई में, कार्य परिभाषा पर जाएं, एक नया संशोधन बनाएं, सेवा को अपडेट करें, फिर थोड़े समय के बाद कार्य फिर से शुरू हो रहे हैं!
जेरलिंगगुगी

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

ऐसा लगता है कि दूसरा नया उदाहरण शुरू करने के अलावा कुछ और कर रहा है।
user130681

2

ECS के बिल्डिंग ब्लॉक के रूप में टास्क को StopTask कॉल द्वारा रोका जा सकता है । सेवा अंतर्निहित कार्यों से बना है जिसे उसी एपीआई कॉल के साथ रोका जा सकता है। केवल लापता हिस्सा यहाँ परिभाषित परिवार पैरामीटर के साथ 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 ने वर्णन किया है।
सूडो आत्मा

0

अमेज़ॅन प्रलेखन के आधार पर ऐसा लगता है कि आपको अपडेट सेवा एपीआई कॉल का उपयोग करके संचालन में स्क्रिप्ट करने में सक्षम होना चाहिए । पिछले लिंक पर कुछ कोड नमूने उपलब्ध हैं, ऐसा लगता है कि आपको अनुकूलित करने में सक्षम होना चाहिए। ऐसा लगता है कि टास्क कॉन्फ़िगरेशन के अपडेट के बाद उपयुक्त कार्य परिभाषा का उपयोग करके सेवाओं को फिर से लोड करने की देखभाल करने के लिए एक स्क्रिप्ट लिखना समस्या का सबसे सुरुचिपूर्ण समाधान होगा।

ईसीएस के साथ एडब्ल्यूएस सीएलआई का उपयोग करने के बारे में अधिक दस्तावेज हैं जो ऐसा लगता है कि बैच की स्क्रिप्टिंग सेवाओं को फिर से शुरू करने से निपटने का सबसे आसान तरीका होगा।


मैं स्क्रिप्ट / कमांड अनुक्रम को लिखने और पोस्ट करने पर काम कर सकता हूं, लेकिन मेरे पास वर्तमान में 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

मेरे पास एक अजगर बोटो 3 स्क्रिप्ट है जो एफएफ करती है:

  1. किसी सेवा के माध्यम से 'RUNNING' स्थिति वाले कार्यों की एक सूची बनाएँ

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

  1. उपरोक्त कार्यों की सूची के लिए लूप के लिए करें और प्रत्येक के माध्यम से रोकें

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

  1. चल रहा है और वांछित प्राप्त करने के लिए सेवा का वर्णन करें

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

  1. अगर लूप चल रहा है तो चल रहा है <वांछित - मतलब एक कार्य वर्तमान में रोका जा रहा है और अभी तक प्रतिस्थापित नहीं किया गया है, इसलिए अगले कार्य को अभी तक रोकें नहीं!

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

यदि लूप अब और सही नहीं है - मतलब रनिंग और वांछित काउंट दोनों समान हैं, तो सूची में अगला कार्य बंद करें।

यह वास्तविक प्रवाह है और मैं वास्तविक कोड को दिखाने में असमर्थ हूं क्योंकि मैं अभी भी अपनी वर्तमान नौकरी द्वारा नियोजित हूं और मेरे सभी कोड उनके हैं :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.