सर्वरलेस कंप्यूटिंग सर्वर को प्रबंधित और प्रोविजन करने के काम को क्लाउड प्रोवाइडर पर उतारने में मदद करता है और अधिकांश प्रौद्योगिकी टीमों के लिए तेजी से एक चीज बन रहा है। AWS Lambda एक प्रकार की सर्वरलेस तकनीक है जिसका उपयोग कई प्रौद्योगिकी टीमों द्वारा किया जाता है। AWS Lambda अधिकांश मुख्य प्रोग्रामिंग भाषाओं का समर्थन करता है, जिनमें NodeJS, Java, Python, और Ruby शामिल हैं। हालांकि मुख्य प्रोग्रामिंग भाषाओं का समर्थन किया जाता है, ऐसे समय हो सकते हैं जब आप इन भाषाओं के साथ बने फ्रेमवर्क का हिस्सा सुविधाओं पर निर्भर सर्वरलेस फंक्शन्स चलाना चाहें। इस पोस्ट में, हम यह पता लगाएंगे कि AWS Lambda में Rails एप्लिकेशन कैसे चलाया जाए। यह पोस्ट मानती है कि आप सर्वरलेस कंप्यूटिंग और AWS Lambda से परिचित हैं और आप यह जानना चाहते हैं कि Rails को AWS Lambda पर कैसे चलाया जाए। Lamby नामक एक टूल AWS Lambda में Rails चलाना लगभग सहज बनाता है, और हम कवर करेंगे कि Lamby का उपयोग Rails को Lambda पर बनाने और डिप्लॉय करने के लिए कैसे किया जा सकता है। मैं इसे "Lambda पर Rails" कहूंगा।
Lamby क्या है?
Lambda आपको अपना कोड डिप्लॉय करने और अपने सर्वर को बनाए रखने के बिना किसी भी पैमाने पर चलाने देता है। आप बस अपना कोड AWS पर अपलोड करते हैं। यह तब चलाया जाएगा जब भी यह किसी घटना द्वारा ट्रिगर किया जाता है, जैसे उपयोगकर्ता वेब पेज का अनुरोध करता है या कोई जॉब कतार में होता है।
Lambda आपके कोड को एक निश्चित तरीके से संरचित करने की अपेक्षा करता है। इसलिए, यदि आप इसका उपयोग Rails ऐप जैसी किसी चीज़ को होस्ट करने के लिए करना चाहते हैं, तो आपको Lamby जैसे एडाप्टर का उपयोग करना होगा।
Lamby एक सरल Rack एडाप्टर है। यह आपके Rails ऐप और AWS Lambda के बीच बैठता है और विभिन्न AWS स्रोतों से Lambda इनवोकेशन इवेंट्स, जैसे API गेटवे या एप्लिकेशन लोड बैलेंसर्स, को Rack इवेंट्स में परिवर्तित करता है जिन्हें आपका Rails ऐप सुन सकता है।
Rails Lambda आर्किटेक्चर स्रोत: Lamby डॉक्स
Lamby Docker और AWS SAM का उपयोग करके Rails ऐप को Lambda पर बिल्ड, पैकेज, और डिप्लॉय करता है।
AWS सर्वरलेस एप्लिकेशन मॉडल (AWS SAM) एक ओपन-सोर्स फ्रेमवर्क है जिसका उपयोग आप AWS पर सर्वरलेस एप्लिकेशन बनाने के लिए कर सकते हैं। एक सर्वरलेस एप्लिकेशन Lambda फंक्शन्स, इवेंट स्रोतों, और अन्य संसाधनों का संयोजन है जो कार्य करने के लिए मिलकर काम करते हैं। ध्यान दें कि एक सर्वरलेस एप्लिकेशन केवल एक Lambda फंक्शन से अधिक है—इसमें अतिरिक्त संसाधन शामिल हो सकते हैं, जैसे APIs, डेटाबेस, और इवेंट स्रोत मैपिंग। -- AWS SAM दस्तावेज़ीकरण
Lamby के साथ शुरुआत करने के लिए, हमें Docker इंस्टॉल करना होगा, एक AWS अकाउंट बनाना होगा, और अपने AWS अकाउंट के लिए प्रोग्रामेटिक एक्सेस कॉन्फ़िगर करना होगा।
Docker इंस्टॉल करना
AWS SAM Lambda रनटाइम एनवायरनमेंट को सिम्युलेट करने के लिए Docker का उपयोग करता है। Docker AWS CLI और SAM CLI दोनों को इंस्टॉल करने की जटिलता को भी कम करता है, जो दोनों Python पर निर्भर हैं। यदि आपके पास पहले से Docker इंस्टॉल नहीं है, तो Docker इंस्टॉल करना सुपर आसान है, क्योंकि आप इसे आधिकारिक वेबसाइट से डाउनलोड और इंस्टॉल कर सकते हैं। यह जांचने के लिए कि Docker इंस्टॉल किया गया है या नहीं, अपने टर्मिनल में नीचे दी गई कमांड चलाएं। यदि Docker इंस्टॉल है, तो आप नीचे दिखाए गए समान संस्करण संख्या और बिल्ड देखेंगे:
$ docker --version
Docker इंस्टॉलेशन पुष्टिकरण
AWS अकाउंट स्थापित करना
यदि आपके पास पहले से AWS अकाउंट नहीं है, तो आपको एक सेट अप करना होगा। Amazon के पास एक फ्री-टियर प्लान है, जो Lambda में Rails ऐप बनाने और टेस्ट करने को कवर करेगा, साथ ही AWS अकाउंट बनाने और सक्रिय करने के तरीके पर एक गाइड भी। अकाउंट सेट अप करने के लिए गाइड का पालन करें।
AWS प्रोग्रामेटिक एक्सेस स्थापित करना
अब जब आपके पास AWS अकाउंट है, तो आपको अपने अकाउंट के AWS एक्सेस की आईडी और AWS सीक्रेट एक्सेस की का उपयोग करके प्रोग्रामेटिक एक्सेस कॉन्फ़िगर करना होगा। यदि आपके पास ये पहले से नहीं हैं, तो आप निम्न कार्य करके उन्हें बना सकते हैं।
- अपने AWS अकाउंट में लॉगिन करें।
- अपने AWS मैनेजमेंट कंसोल में, टूलबार में "Services" पर क्लिक करें।
- "IAM" खोजें और चुनें।
- बाएं नेविगेशन से "Users" पर क्लिक करें।
- यदि "IAM" पहले से मौजूद है, तो अपना उपयोगकर्ता नाम चुनें।
- "Security credentials" टैब पर क्लिक करें।
- "Create access key" बटन पर क्लिक करें।
- अपनी की आईडी और सीक्रेट को एक सुरक्षित स्थान पर कॉपी करें।
- यदि कोई "IAM" उपयोगकर्ता मौजूद नहीं है,
- "Add user" पर क्लिक करें।
- एक उपयोगकर्ता नाम जोड़ें और "Programmatic access" विकल्प चुनें।
- प्रक्रिया पूरी करने के लिए संकेतों का पालन करें।
आइए Docker का उपयोग करके CLI प्रोग्रामेटिक एक्सेस कॉन्फ़िगर करें। नीचे दिए गए कोड को अपने टर्मिनल में कॉपी करें। आपको AWS एक्सेस की आईडी और AWS सीक्रेट एक्सेस की के लिए प्रॉम्प्ट किया जाएगा; पिछले चरण से कीज़ दर्ज करें।
$ docker run \ --interactive \ --tty \ --rm \ --volume "${HOME}/.aws:/root/.aws" \ "amazon/aws-cli" \ configure 
नया Rails एप्लिकेशन बनाना
हम अपने Rails प्रोजेक्ट को बूटस्ट्रैप करने के लिए SAM CLI का उपयोग करेंगे। AWS SAM CLI आपको एक GitHub रिपॉजिटरी टेम्पलेट से एक नया प्रोजेक्ट इनिशियलाइज़ करने की अनुमति देता है, जिसे आमतौर पर कुकीकटर कहा जाता है। एक नया SAM प्रोजेक्ट शुरू करने के लिए, हम sam init चलाने के लिए एक Docker कंटेनर का उपयोग करेंगे, जो एक नया प्रोजेक्ट फोल्डर किकस्टार्ट करने के लिए Lamby कुकीकटर प्रोजेक्ट टेम्पलेट का लाभ उठाता है। आपको एक प्रोजेक्ट नाम प्रदान करने के लिए प्रॉम्प्ट किया जाएगा, लेकिन मैंने "rails_on_lambda" का उपयोग किया है।
$ docker run \ --rm \ --interactive \ --volume "${PWD}:/var/task:delegated" \ lambci/lambda:build-ruby2.7 \ sam init --location "gh:customink/lamby-cookiecutter" 
आपके नए SAM प्रोजेक्ट फोल्डर में आपके नए Rails ऑन Lambda प्रोजेक्ट के लिए आवश्यक सब कुछ है। उच्च स्तर से, यहां आपके नए प्रोजेक्ट में क्या उत्पन्न किया गया है।
- Dockerfile और docker-compose दोनों का उपयोग करके Docker सेटअप।
- एक कार्यशील रूबी प्रोजेक्ट जिसमें lib डायरेक्टरी, बंडलर, और टेस्ट्स हैं।
- एक SAM
template.yamlफाइल।
सेट अप और डिप्लॉय
अब जब हमने एक नया Rails ऐप बना लिया है, तो हमें इसे Lambda डिप्लॉयमेंट के लिए सेट अप करना होगा। नीचे दी गई दो कमांड्स स्क्रिप्ट्स चलाती हैं जो एक Docker डेवलपमेंट इमेज बनाती हैं और जेम्स बंडल करती हैं। bootstrap कमांड एक बार की प्रक्रिया है, जबकि setup कमांड हर बार चलाई जाएगी जब आप एक नई प्रोजेक्ट निर्भरता जोड़ते हैं।
$ ./bin/bootstrap $ ./bin/setup पिछली कमांड्स के सफल निष्पादन पर, आपका प्रोजेक्ट SAM के माध्यम से डिप्लॉयमेंट के लिए तैयार है। डिप्लॉयमेंट एक Lamby स्क्रिप्ट का उपयोग करके किया जाता है जो आपके Rails एप्लिकेशन को बिल्ड, पैकेज, और डिप्लॉय करती है।
./bin/deploy deploy कमांड एक Lamby बिल्ड स्क्रिप्ट चलाती है जो आपके वर्तमान प्रोजेक्ट डायरेक्टरी को एक स्थानीय .lamby डायरेक्टरी में डुप्लिकेट करती है और आपके एप्लिकेशन को डिप्लॉय करने के लिए आवश्यक तीन SAM कमांड्स चलाती है।
- sam build
- sam package
- sam deploy
यदि स्क्रिप्ट्स अपेक्षा के अनुरूप चलती हैं, तो आपको SAM के CloudFormation डिप्लॉयमेंट कार्यों के लिए आउटपुट दिखाई देगा जो इस तरह समाप्त होता है:

आपको टर्मिनल आउटपुट के हिस्से के रूप में एक URL भी दिखाई देगा। URL एक API गेटवे HTTP API एंडपॉइंट है जो Rack का उपयोग करके आपके Rails एप्लिकेशन को इनवोक करता है। इसे अपने ब्राउज़र में खोलें, और आपको परिचित "Welcome to Rails" स्क्रीन दिखाई देनी चाहिए:

AWS कंसोल से अपने Rails ऐप को इनवोक करना
हम अपने ऐप को Lambda डैशबोर्ड से भी टेस्ट कर सकते हैं। AWS मैनेजमेंट कंसोल में लॉगिन करें:
- टूलबार में "Services" पर क्लिक करें।
- "Lambda" को फाइंड सर्विसेज फील्ड में दर्ज करें, चुनें।
इस पेज से, आप अपना नया डिप्लॉय किया गया "RailsOnLambda" प्रोजेक्ट देखेंगे।

- "RailsOnLambda" फंक्शन खोलें।
- ऊपरी दाएं कोने में "Test" बटन पर क्लिक करें।
- "Amazon API Gateway Proxy" इवेंट टेम्पलेट का उपयोग करें (नीचे दिए गए JSON टेम्पलेट का उपयोग करके संबंधित फ़ील्ड्स अपडेट करें)। <इसे "RailsOnLambdaTest" नाम दें।
- "Create" बटन पर क्लिक करें।
- अपने Lambda को इनवोक करने के लिए "Test" बटन पर क्लिक करें।
{ "body": "", "path": "/", "httpMethod": "GET", "queryStringParameters": {}, "multiValueQueryStringParameters": {}, "pathParameters": { "proxy": "/" }, "stageVariables": {}, "requestContext": { "path": "/", "httpMethod": "GET" } } यह मानते हुए कि सब कुछ सुचारू रूप से चला, आपको नीचे दिए गए आउटपुट के समान कुछ दिखाई देना चाहिए।

बधाई! अब आपके पास Lambda पर Rails है, हालांकि Lambda पर एक Rails एप्लिकेशन अभी भी केवल एक सामान्य Rails एप्लिकेशन है। एकमात्र अंतर यह है कि Lamby जेम API गेटवे HTTP API, API गेटवे REST API, और एप्लिकेशन लोड बैलेंसर टार्गेट इवेंट्स को Rack-संगत env ऑब्जेक्ट्स में परिवर्तित करता है और उन्हें Rails को भेजता है। Rails फिर इवेंट के परिणाम को आपके प्रोजेक्ट में परिभाषित Lambda हैंडलर को वापस पास करता है।
def handler(event:, context:) Lamby.handler $app, event, context end Rails ऑन Lambda कैसा प्रदर्शन करता है?
डिप्लॉयमेंट के बाद पहले अनुरोध के लिए Rails ऑन Lambda धीमी प्रतिक्रिया समय का अनुभव करेगा। इस घटना को "कोल्ड स्टार्ट" कहा जाता है। हालांकि, पहले अनुरोध के बाद, प्रदर्शन उत्कृष्ट है और EC2 को पूरा कर सकता है या हरा सकता है। यदि पहले अनुरोध के बाद कोई बाद के अनुरोध नहीं हैं, तो Rails ऐप की सेवा करने वाले सर्वर संसाधनों को लगभग 5-7 मिनट के बाद अन्य Lambda फंक्शन्स को डायनामिक रूप से असाइन किया जाएगा। यह नए अनुरोधों के लिए कोल्ड स्टार्ट का कारण बनेगा। कोल्ड स्टार्ट से बचने और Rails ऐप को गर्म रखने के कुछ तरीके हैं।
CloudWatch टाइमर
आप अपने Rails ऑन Lambda फंक्शन को हर मिनट पिंग करने के लिए एक टाइमर सेट कर सकते हैं ताकि यह गर्म रहे। AWS कंसोल खोलें और CloudWatch खोजें। वहां से, Events पर जाएं और Create rule पर क्लिक करें। इवेंट प्रकार को Schedule पर सेट करें, और हम इस इवेंट को हर 1 मिनट चलाएंगे।

प्रोविज़न्ड कंकरेंसी
प्रोविज़न्ड कंकरेंसी एक AWS फीचर है जो आपको टॉगल करने और अधिक भुगतान करने के लिए सहमत होने की अनुमति देता है ताकि AWS हर समय एक अनउपयोग कंटेनर चलाता रहे। Rails ऐप के लिए प्रोविज़न्ड कंकरेंसी कॉन्फ़िगर करने के लिए, अपना AWS कंसोल खोलें और Lambda सेवा पेज खोलें।
- एक फंक्शन चुनें (rails-on-lambda)।
- Configuration चुनें और फिर Concurrency चुनें।
- Provisioned concurrency configurations के तहत, Add configuration पर क्लिक करें।
- या तो alias या version चुनें।
- आवंटित करने के लिए प्रोविज़न्ड कंकरेंसी की मात्रा दर्ज करें (उदाहरण के लिए, 500)।
- अपने परिवर्तन सेव करें। प्रोविज़न्ड कंकरेंसी को AWS CLI का उपयोग करके निम्न कमांड से भी कॉन्फ़िगर किया जा सकता है:
aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE --provisioned-concurrent-executions 100 AWS पर Lambda की लागत क्या है?
AWS Lambda के साथ, आप केवल उसी के लिए भुगतान करते हैं जिसका आप उपयोग करते हैं। लागत अनुरोधों की संख्या और कोड निष्पादन की अवधि का संयोजन है। अवधि की कीमत आपके फंक्शन को आवंटित मेमोरी की मात्रा पर निर्भर करती है। मेमोरी आकार 128 MB से 10,240 MB तक होते हैं, और आप अपनी आवश्यकताओं के आधार पर अपने फंक्शन को किसी भी मात्रा में मेमोरी आवंटित कर सकते हैं। नीचे एक चार्ट है जो अलग-अलग समय में Lambda फंक्शन के 100,000 इनवोकेशन्स चलाने की लागत दिखाता है।
Lambda लागत
आपको Rails को Lambda पर कब नहीं चलाना चाहिए
हमने देखा है कि हम AWS Lambda पर Rails ऐप चला सकते हैं, लेकिन क्या हर Rails एप्लिकेशन को Lambda पर चलना चाहिए? Rails मानता है कि आपका एप्लिकेशन पारंपरिक सर्वर पर चल रहा है न कि सर्वरलेस। कुछ ऑपरेशन्स जो पारंपरिक Rails सर्वर ऐप में आसानी से काम करते हैं, वे सर्वरलेस में काम नहीं कर सकते हैं। उदाहरण के लिए, फाइल या इमेज अपलोड Rails ऑन Lambda ऐप में काम नहीं करेंगे क्योंकि ऐप के पास लगातार फाइल सिस्टम तक पहुंच नहीं है। इसके अलावा, WebSocket संचार Lambda पर काम नहीं करेगा क्योंकि जब कोई अनुरोध नहीं होते तो आपका सर्वर मौजूद नहीं होता।
निष्कर्ष
हमने केवल एक बुनियादी Rails एप्लिकेशन को डिप्लॉय करने का तरीका दिखाया है, लेकिन बड़ी एप्लिकेशन्स के लिए भी वही प्रक्रिया अपनाई जाती है। बेझिझक कंट्रोलर्स और रूट्स जोड़ें और कंसोल या Postman और किसी अन्य HTTP क्लाइंट के माध्यम से टेस्ट करें।