इस साल की शुरुआत में हम एक डेडिकेटेड सर्वर होस्टिंग सुविधा से AWS पर चले गए, और हमें बहुत खुशी है कि हमने ऐसा किया। हमें खुशी है कि हमारे पास बहुत सारा ऑटोमेशन है, क्योंकि इस तरह हम सर्वरों के साथ छेड़छाड़ करने में कम समय बिताते हैं। :) यह पोस्ट बताता है कि जब हमारे पास प्रोसेस की जा रही त्रुटि सूचनाओं की मात्रा में परिवर्तन होता है तो हमारे इन्फ्रास्ट्रक्चर में क्या होता है।
हम कैसे स्केल करते हैं
हमारा प्रोसेसिंग पाइपलाइन साइडक्विक पर बहुत अधिक निर्भर करता है, जो हमारे लिए रॉक-सॉलिड रहा है। पाइपलाइन में अधिकांश कार्य उन इंस्टेंसेस द्वारा नियंत्रित किए जाते हैं जो एक ऑटोस्केलिंग ग्रुप से संबंधित होते हैं। जब साइडक्विक बैकलॉग बढ़ता है, तो एक क्लाउडवॉच अलार्म ट्रिगर होता है, जिससे इस ग्रुप में नए इंस्टेंस शुरू हो जाते हैं। जैसे-जैसे ट्रैफिक कम होता है और बैकलॉग गायब होता है, इंस्टेंस समाप्त हो जाते हैं।
स्टाइल के साथ हम कैसे स्केल करते हैं
इस सेटअप में एकमात्र अड़चन यह है कि हम यह सुनिश्चित करना चाहेंगे कि साइडक्विक वर्कर्स इंस्टेंस के समाप्त होने से पहले अपना सारा काम पूरा कर लें। भले ही साइडक्विक पूरा होने से पहले समाप्त होने वाली नौकरियों को पुनर्निर्धारित करने का समर्थन करता है, हम जब संभव हो इससे बचना पसंद करते हैं - एक नौकरी को पूरा करने में कुछ अतिरिक्त सेकंड लेना बेहतर है बजाय इसके कि उसे पुनर्निर्धारित और पुनः आरंभ किया जाए। सौभाग्य से, अपनी भयानकता में, साइडक्विक के पास वर्कर प्रोसेसेस को वर्तमान नौकरी पूरी होने के बाद नया काम स्वीकार करना बंद करने के लिए कहने की एक विधि है, जिससे समाप्ति की तैयारी में वर्कर्स को ड्रेन करना आसान हो जाता है। तरकीब उन वर्कर्स को यह बताने में है कि उन्हें ड्रेन करना शुरू करने की आवश्यकता है - और इसके लिए, हम लाइफसाइकिल हुक्स, क्लाउडवॉच इवेंट्स + लैम्ब्डा, EC2 सिंपल सिस्टम्स मैनेजर, और थोड़े से कोड के संयोजन का उपयोग करते हैं।
इस पोस्ट का बाकी हिस्सा आपको दिखाएगा कि कैसे आप हमारे सेटअप को कॉपी करके इंस्टेंसेस प्राप्त कर सकते हैं जो धीरे से उस अच्छी रात में चले जाते हैं।
पूर्वापेक्षाएँ
स्वाभाविक रूप से, आपको एक ऑटोस्केलिंग ग्रुप की आवश्यकता होगी जिसमें एक स्केलिंग पॉलिसी हो जो आपके द्वारा परिभाषित किसी नियम के आधार पर इंस्टेंस को समाप्त करती हो। इसके अलावा, आपको अपने इंस्टेंस को SSM एजेंट चलाने और SSM एक्सेस वाली भूमिका में चलाने के लिए कॉन्फ़िगर करना होगा। इन इंस्टेंसेस को ऑटोस्केलिंग API के साथ इंटरैक्ट करने के लिए अनुमतियों की भी आवश्यकता होगी। यहां इंस्टेंस भूमिका के लिए एक पॉलिसी दस्तावेज है:
कोड
एक बार वे आइटम्स जगह पर हों, तो आप टुकड़ों को जोड़ना शुरू कर सकते हैं। हम प्रक्रिया के अंत से शुरू करेंगे - हमारे स्क्रिप्ट्स जो इंस्टेंस पर रहेंगे और साइडक्विक ड्रेनिंग को संभालेंगे - और हम पीछे की ओर काम करेंगे। पहले, रूबी कोड जो वर्कर्स को शांत करेगा और उनके काम खत्म करने का इंतजार करेगा:
हम साइडक्विक API के माध्यम से वर्तमान इंस्टेंस पर चल रहे साइडक्विक प्रोसेसेस की एक सूची प्राप्त करते हैं, उन्हें नया काम स्वीकार करना बंद करने के लिए कहते हैं, फिर तब तक प्रतीक्षा करते हैं जब तक सभी प्रोसेस में कोई सक्रिय नौकरी नहीं रह जाती।
यहां वह शेल स्क्रिप्ट है जो इंस्टेंस को समाप्त करने का समय आने पर उस स्क्रिप्ट को ट्रिगर करेगी:
इस स्क्रिप्ट का मांस लाइन 8 से शुरू होता है। पहले हम ऑटोस्केलिंग ग्रुप को संकेत देते हैं कि हम लाइफसाइकिल हुक पर काम कर रहे हैं। इसका एक दुष्प्रभाव यह है कि यह एक गार्ड है - यदि इस इंस्टेंस को ऑटोस्केलिंग ग्रुप द्वारा समाप्ति के लिए निर्धारित नहीं किया गया है, तो यह कमांड विफल हो जाएगी, और वर्कर शटडाउन स्क्रिप्ट को इनवोक नहीं किया जाएगा। इस स्क्रिप्ट को तब तक नहीं बुलाया जाना चाहिए जब तक कि इंस्टेंस को समाप्ति के लिए निर्धारित नहीं किया गया हो, लेकिन थोड़ा रक्षात्मक होने में कोई हर्ज नहीं है। :) मान लें कि हम आगे बढ़ रहे हैं, हम वर्कर्स को बंद करते हैं, और फिर हम ऑटोस्केलिंग ग्रुप को समाप्ति के साथ आगे बढ़ने के लिए कहते हैं। यदि हम वह API कॉल नहीं करते हैं, तो इंस्टेंस हुक के टाइमआउट की समाप्ति तक चलता रहेगा (हम थोड़ी देर में उस पर पहुंचेंगे)।
SSM दस्तावेज़
अब हमें कुछ चाहिए जो इस शेल स्क्रिप्ट को ट्रिगर करे। यहीं SSM एजेंट आता है। यह पृष्ठभूमि में खुशी-खुशी चल रहा है, SendCommand के माध्यम से दिखाने के लिए एक दस्तावेज की प्रतीक्षा कर रहा है जो उसे बताए कि क्या करना है। हमारा दस्तावेज़ एजेंट को समाप्ति स्क्रिप्ट चलाने का निर्देश देता है:
आप EC2 कंसोल के सिस्टम्स मैनेजर शेयर्ड रिसोर्सेज सेक्शन में Documents लिंक पर क्लिक करके, Create Document बटन पर क्लिक करके, और उस JSON को कंटेंट बॉक्स में डालकर अपना दस्तावेज़ बना सकते हैं।
लैम्ब्डा फंक्शन
अपने दस्तावेज़ के साथ, एक लैम्ब्डा फंक्शन बनाएं जो टार्गेट इंस्टेंस पर इसे चलाएगा जब इंस्टेंस को समाप्त करने का समय होगा। इसके लिए कुछ कोड यहां दिया गया है:
आपको PrepInstanceForTermination को अपने दस्तावेज़ के लिए चुने गए नाम से बदलना होगा, लेकिन अन्यथा यह कोड केवल कॉपी-एंड-पेस्ट है।
इस लैम्ब्डा फंक्शन को कुछ अनुमतियों की आवश्यकता होती है (सामान्य लैम्ब्डा अनुमतियों के अलावा), और उसके लिए एक IAM पॉलिसी दस्तावेज़ यहां दिया गया है:
फिर से, आपको दस्तावेज़ का नाम बदलने की आवश्यकता हो सकती है।
हुक और इवेंट नियम
बने रहें - हम लगभग वहां हैं! आपके पास करने के लिए दो चीजें बची हैं: क्लाउडवॉच इवेंट और लाइफसाइकिल हुक बनाएं। पहले, इवेंट:
क्लाउडवॉच मैनेजमेंट कंसोल में, साइडबार में Events पर क्लिक करें, और फिर Create rule बटन पर क्लिक करें। यह वह है जो आपके द्वारा अभी बनाए गए लैम्ब्डा फंक्शन को ट्रिगर करेगा।

बाईं ओर आप उस इवेंट को चुनते हैं जिसे आप देखना चाहते हैं और उस इवेंट के बारे में कोई अतिरिक्त विशेषताएं (जैसे कि कौन से ऑटोस्केलिंग ग्रुप इस इवेंट को ट्रिगर करेंगे), और दाईं ओर आप नियम के लक्ष्य को चुनते हैं - हमारे मामले में, हमने पहले जो लैम्ब्डा फंक्शन बनाया था। आपको लैम्ब्डा फंक्शन लक्ष्य के लिए किसी भी डिफ़ॉल्ट को बदलने की आवश्यकता नहीं है।
एक बार यह हो जाने के बाद, EC2 मैनेजमेंट कंसोल पर वापस जाएं और उस ऑटोस्केलिंग ग्रुप पर नेविगेट करें जिसमें वे इंस्टेंस हैं जिन्हें आप प्रबंधित करना चाहते हैं। Lifecycle Hooks टैब पर क्लिक करने के बाद, आप एक हुक बना पाएंगे। हमारा ऐसा दिखता है:

Terminate वह ट्रांजिशन है जिसमें हम रुचि रखते हैं, और हम चाहते हैं कि समाप्ति आगे बढ़े (Default Result: CONTINUE) यदि किसी कारण से हमारे शेल स्क्रिप्ट में API कॉल 600 सेकंड (Heartbeat Timeout) के बाद नहीं होता है। इसका परिणाम यह होगा कि हमारे इंस्टेंस एक तरह से या दूसरे तरीके से समाप्त हो जाएंगे, भले ही साइडक्विक वर्कर्स 10 मिनट के बाद समाप्त न हों।
यह एक लपेट है
आपने कर दिखाया! अब आपके पास एक ऑटोस्केलिंग ग्रुप है जो अपने साइडक्विक इंस्टेंस को मानवीय तरीके से समाप्त कर सकता है। आनंद लें!
P.S.: श्रेय awslabs को जाता है इन टुकड़ों को एक साथ रखने पर एक सुपर-हेल्पफुल ट्यूटोरियल के लिए।