जब यो अनुप्रयोग तैनाती गर्ने समय आयो मैले AWS कोसिस गरें, तर इमानदारीपूर्वक म तिनीहरूले प्रदान गर्ने जानकारी र सेवाहरूको मात्रासँग बेवास्ता गरेको थिएँ, र म साँच्चै मेरो आवेदन त्यहाँ जंगलमा हेर्न चाहन्छु। त्यसैले म Vercel भेटें। यसको शीर्षमा, म डकरको बारेमा सिकिरहेको छु र मैले अहिलेसम्म सिकेको कुरालाई व्यवहारमा उतार्न चाहन्छु, यो सही अवसर थियो।
Vercel तिनीहरूको शून्य कन्फिगरेसन डिप्लोइमेन्टको लागि परिचित छ। केवल एक जोडी क्लिक संग तपाईं आफ्नो आवेदन तैनात गर्न सक्नुहुन्छ। तपाइँ तपाइँको भण्डार जडान गर्न सक्नुहुन्छ र Vercel ले तुरुन्तै तपाइँको परियोजना प्रत्येक कमिट पछि निर्माण र तैनाती गर्नेछ। यो भन्दा धेरै सुविधाजनक हुन सक्दैन 😀। मैले AWS मा Vercel रोजेको अर्को कारण तिनीहरूको 'सर्भरलेस' प्रकार्य थियो, जुन मैले मेरो डाटाबेसबाट एक्सप्रेस API मार्फत कागजातहरू रेन्डर गर्न प्रयोग गरेको छु। इमानदार हुन, म तिनीहरूको सेवाको बारेमा गुनासो गर्न सक्दिन। मलाई मेरो प्रोजेक्टमा कुनै पनि समस्या भएको छैन। यहाँ कुरा यो हो कि म मेरो एप्लिकेसनको ब्याकइन्डको बारेमा थप जान्न चाहन्थें र मैले सोचें कि यसको प्रयोगलाई बुझ्दा मलाई त्यसमा मद्दत गर्न सक्छ। मैले धेरै मानिसहरूलाई तिनीहरूको मूल्य निर्धारण योजनाको कारणले Vercel मा AWS छनौट गरेको देखेको छु। यो मेरो मामलामा लागू हुँदैन किनकि मेरो आवेदनमा त्यति धेरै ट्राफिक छैन र म यसलाई मुख्य रूपमा अध्ययन उद्देश्यका लागि प्रयोग गर्दैछु। तर यो उल्लेख गर्न राम्रो छ कि Vercel सँग "समस्या" छ जब यो मूल्य निर्धारण को लागी आउँछ।
टोरन्टो फूड बास्केट एप्लिकेसनलाई तीन फरक भागमा विभाजन गर्न सकिन्छ:
स्थानीय किराना पसलबाट जानकारी सङ्कलनका लागि वेबस्क्रेपर
एक्सप्रेस API जसले जानकारी व्यवस्थित गर्दछ र त्यसो गर्न गणितीय कार्यहरू गर्न सक्छ।
अनुप्रयोग र सबै आवश्यक जानकारी रेन्डर गर्ने अनुप्रयोग प्रतिक्रिया।
अहिलेको लागि म वेबस्क्रेपरलाई AWS मा मात्रै डिप्लोय गर्दैछु किनकि मलाई एक्सप्रेस एपीआई र प्रतिक्रिया एप डिप्लोय गर्न सर्भर र रुटहरू बारे थप जान्न आवश्यक छ। सुरु गर्नको लागि मैले AWS EC2 दृष्टान्त सुरु गरें र बजेट अलार्म सेट गरें ताकि जुनसुकै बेला मेरो उदाहरणमा खर्च $ ०.०१ मा जान्छ मैले एक सूचना पाउँछु - मैले डिसेम्बरदेखि मेरो खातामा चलिरहेको DocumentDB उदाहरणको लागि बिल गरिसकेपछिको कठिन तरिका थाहा पाएँ। /2023 र थाहा थिएन 😂। Amazon ले 750 घन्टा t2.micro (वा t2.micro उपलब्ध नभएको क्षेत्रहरूमा t3.micro), 30Gib EBS भण्डारण, 2 मिलियन IOs, 1 GB स्न्यापसट र 100 GB ब्यान्डविथ इन्टरनेटमा उपलब्ध गराउँछ।
AWS मा मेरो डकराइज्ड एप्लिकेसन कसरी डिप्लोय गर्ने भनेर सिक्ने क्रममा मैले महसुस गरें कि त्यहाँ कम्तिमा दुई फरक दृष्टिकोणहरू छन् - त्यहाँ थप हुन सक्छ:
डकर कन्टेनर स्थानीय रूपमा निर्माण गर्नुहोस् र कन्टेनर मात्र AWS मा पठाउनुहोस्।
AWS मा सबै पठाउनुहोस् र टाढाबाट मेरो कन्टेनर निर्माण गर्नुहोस्।
मैले दोस्रो दृष्टिकोण रोजेको छु किनकि यदि म मेरो आवेदनमा पूर्ण रूपमा रिमोट काम गर्ने अनुभव चाहन्थे भने। म सधैं मेरो आफ्नै कम्प्युटरमा छैन र EC2 उदाहरणमा मेरो आवेदन ती परिस्थितिहरूमा साँच्चै उपयोगी हुनेछ। साथै, म विमसँग काम गर्न बाध्य हुनेछु, जुन मैले गर्न चाहेको कुरा हो। मेरो EC2 उदाहरणमा फाइलहरू पठाउनु अघि मैले Node.js र Docker स्थापना गरेर मेरो रिमोट वातावरण तयार गरें।
मेरो EC2 उदाहरणमा फाइलहरू पठाउनको लागि मैले सुरक्षित प्रतिलिपि प्रोटोकल (scp) प्रयोग गरें। आदेश यस्तो देखियो:
scp -i ubuntu.pem -r LOCAL_DIRECTORY [email protected]:/home/ubuntu/downloads/webscraperdockeraws
-i ubuntu.pem
: यो फ्ल्यागले सार्वजनिक कुञ्जी प्रमाणीकरणको लागि प्रयोग गर्नको लागि पहिचान फाइल (निजी कुञ्जी) निर्दिष्ट गर्दछ। यस अवस्थामा, ubuntu.pem
रिमोट सर्भरमा प्रमाणीकरण गर्न प्रयोग गरिने निजी कुञ्जी फाइल हो।-r
: यो फ्ल्यागले अपरेशन पुनरावर्ती हुनुपर्छ भनेर संकेत गर्छ, यसको मतलब यसले डाइरेक्टरीहरू र तिनीहरूको सामग्री पुनरावर्ती रूपमा प्रतिलिपि गर्नेछ।[email protected]:/home/ubuntu/downloads/webscraperdockeraws
: यो गन्तव्य निर्दिष्टीकरण हो। यसले रिमोट सर्भरको प्रयोगकर्ता नाम ( ubuntu
) र IP ठेगाना ( 35.183.21.127
) समावेश गर्दछ, त्यसपछि डाइरेक्टरी मार्ग ( /home/ubuntu/downloads
) जहाँ फाइलहरू प्रतिलिपि गरिनेछ।
एकचोटि सबै फाइलहरू मेरो EC2 उदाहरणमा स्थानान्तरण भएपछि म मेरो डकर कन्टेनर निर्माण गर्न सक्षम भएँ। र यहाँ बगहरू सुरु भयो - हो! मेरो Webscraper को सबैभन्दा महत्त्वपूर्ण पुस्तकालय Puppeteer हो, जसले DevTools Protocol मा Chrome/Chromium लाई नियन्त्रण गर्न उच्च-स्तर API प्रदान गर्दछ। कठपुतली हेडलेस मोडमा चल्छ, यसको कार्यान्वयन छिटो बनाउँछ। तर मेरो आवेदन डकराइज गर्ने प्रयास गर्दा मैले केही समस्याहरू भेट्टाएँ:
पूर्वनिर्धारित रूपमा, जब पपेटियर स्थापना हुन्छ यसले परीक्षणको लागि क्रोम र क्रोम-हेडलेस-शेल बाइनरी डाउनलोड गर्दछ। ब्राउजर $HOME/.cache/puppeteer फोल्डरमा डाउनलोड हुन्छ। समस्या यो हो कि AWS ले यसको Ubuntu उदाहरणमा $HOME/.cache समावेश गर्दैन। मैले केहि अनुसन्धान पछि यो मुद्दा फेला पारे, र समाधान गर्न मैले /.cache फोल्डरलाई रूट डाइरेक्टरीमा सार्नु थियो - यो मुद्दा Puppeteers को npm पोर्टलमा राम्रोसँग दस्तावेज गरिएको छ।
एउटा स्पष्ट कुरा मैले बुझेको छैन कि अहिले सम्म मैले Windows र MacOs जस्तै OS मा मेरो एप्लिकेसन चलाउँदै थिएँ। तर अब म Ubuntu सँग काम गरिरहेको थिएँ। र किनभने यो खाली उदाहरण थियो यसले कुनै प्याकेज/एप पूर्व-स्थापित गरेको थिएन, यसैले मैले पहिलो पटक उदाहरण चलाउने बित्तिकै नोड र डकर स्थापना गरें। तर म मेरो Webscraper को लागि काम गर्न को लागी एक साँच्चै महत्त्वपूर्ण अनुप्रयोग बिर्सदै थिए: Google Chrome। याद गर्नुहोस् मैले पहिले कठपुतलीको बारेमा के भनेको थिएँ? ठीक छ, मैले मेरो उदाहरणमा क्रोमियमको सही संस्करण छ भनी सुनिश्चित गर्न आवश्यक छ। Node.js को प्रत्येक प्रमुख संस्करण डेबियनको संस्करणमा बनाइएको छ, र त्यो डेबियन संस्करण क्रोमियमको पुरानो संस्करणको साथ आउँछ, जुन कहिलेकाहीँ पपेटियरको नवीनतम संस्करणसँग उपयुक्त हुँदैन। केही अनुसन्धान पछि मैले पत्ता लगाएँ कि मैले मेरो डकरफाइलमा एक निर्देशन समावेश गर्नुपर्यो ताकि डकरले मेरो एपको सबै निर्भरताहरू स्थापना गर्नु अघि क्रोमियमको सही संस्करण डाउनलोड गर्न सकिन्थ्यो र यसलाई चलाउनु पर्छ। मेरो डकर फाइल यो जस्तो देखिन्थ्यो:
अघिल्लो समस्या समाधान गरेपछि अर्को समस्या आयो। अब त्रुटि सन्देश भन्छ: "कुनै प्रयोगयोग्य स्यान्डबक्स छैन"। यसलाई ठीक गर्न मैले मेरो कोड परिवर्तन गर्नु पर्ने थियो र मेरो किराना उत्पादनहरू मध्ये प्रत्येक एकको लागि puppeteer.launch() प्रकार्यमा -no-sandbox argument समावेश गर्नु थियो।
सकियो। अब मेरो वेबस्क्रेपर मेरो AWS EC2 उदाहरणमा कन्टेनरमा चल्छ। यद्यपि यसले सबै 65 उत्पादनहरू स्क्र्याप गर्दैन।। पाँचौं उत्पादन पछि अनुप्रयोग क्र्यास हुन्छ। मलाई विश्वास छ कि यो यस उदाहरणमा उपलब्ध स्रोतहरूसँग गर्नको लागि केहि छ - म गीथब कार्यहरूको साथ स्क्र्यापर चलाउँदा उही समस्याको सामना गरिरहेको थिएँ। जे भए पनि, मेरो लक्ष्य AWS EC2 उदाहरण सुरु गर्नु थियो र मेरो अनुप्रयोग टाढाबाट चलिरहेको थियो, र मैले गरे। आउन धेरै!