CloudFormation आपके APIG को कम नहीं करता है: इसे कैसे ठीक करें

समस्या:

CloudFormation आपके API गेटवे चरण (ओं) को फिर से तैयार नहीं करता है, भले ही यह उन संसाधनों को अपडेट करता हो।

परिदृश्य:

मेरी टीम और मेरे पास एक सैम टेम्प्लेट है जिसमें लैम्ब्डा संसाधन हैं। हम स्पष्ट रूप से AWS :: Serverless :: Api संसाधन नहीं बनाते हैं क्योंकि जब वे AWS में उपयोग किए जाते हैं, तो हमारे लिए अंतर्निहित रूप से Api संसाधन :: Serverless :: फ़ंक्शन संसाधन। हम उन तैनाती के महीनों से गुज़रे जिनमें हमारे कार्यों के अद्यतन शामिल थे लेकिन उनके नाम स्थिर थे। हमारे लैंबडास के नामों के लिए शुरू किए गए संस्करण को भी एक मुद्दा पेश किया। हमने एपीआई गेटवे संसाधनों को ग्रहण किया, जो हमारे लैंबडास के नामों को बदलने पर क्लाउडफ़ॉर्मेशन द्वारा उन कार्यों को ट्रिगर करते हैं, जिन्हें फिर से चालू किया जाएगा, लेकिन ऐसा नहीं है। CloudFormation परिनियोजन ने संस्करण नाम के साथ एक नया लैंबडा बनाया, लेकिन इसने API गेटवे परिनियोजन को कभी अद्यतन नहीं किया, जिससे API एंडपॉइंट लैंबडास को ट्रिगर करने के लिए देख रहा है कि अब अस्तित्व में नहीं है। इसके परिणामस्वरूप आंतरिक सर्वर त्रुटियां हुईं।

समस्या को हल करने के लिए, यह उन संस्करणों का नाम था जो त्रुटि के बारे में समझ में आए। यह पहले कभी नहीं हुआ क्योंकि हमने पहले कभी अपने लैम्ब्डा संसाधनों का संस्करण नहीं दिया था, इसलिए एपीआई गेटवे का पुनर्विकास आवश्यक नहीं था क्योंकि यह अभी भी उसी फ़ंक्शन नाम के नवीनतम: लाइव संस्करण की ओर इशारा कर रहा था। फिर, हमने अपने लैम्ब्डा में संस्करण नाम जोड़े, और अपने आवेदन को चलाने की कोशिश करने पर तुरंत हमें 501 त्रुटियां मिलीं।

समाधान:

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

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

मेरे CodePipeline में एक लैम्ब्डा जोड़ना यह था कि मैंने इस मुद्दे को कैसे हल किया।

कदम:

1 - अपना लैंबडा बनाएं

लैंबडा को कुछ इस तरह देखना चाहिए:

Export.handler = async (ईवेंट) => {कास्ट जॉब = ईवेंट ['CodePipeline.job']; {const पैरामीटर = JSON.parse (job.data.actionConfiguration। कॉन्फ़िगरेशन .UserParameters) आज़माएं;
        const {apiId} = पैरामीटर;
        letParams = {restApiId: apiId, stageName: 'Prod'};
        apitway.deleteStage (deleteParams) .promise () का इंतजार करें;
        चलो परिनियोजनपार्म्स = {restApiId: apiId, विवरण: 'परिनियोजन लैंब के माध्यम से बनाया गया।}}
        let तैनाती = प्रतीक्षित apigateway .createDeployment (परिनियोजनपार्म्स) .प्रोमाइस ();
        letParams = {dep तैनातीId: dep तैनाती.id, restApiId: apiId, stageName: 'Prod',};
        apitway.createStage (createParams) .promise () का इंतजार करें;
        updateParams = {restApiId: apiId, stageName: 'Prod', patchOperations: [{from: '*', op: "प्रतिस्थापित", पथ: "/ परिनियोजन", मान, परिनियोजन .id}]};
        letResResult = wait apigateway .updateStage (updateParams) .promise ();
if (updateResult.deploymentId) {प्रतीक्षा कोडपिपलीन .putJobSuccessResult ({jobId: job.id}) .promise (); } और {// असफल एपीआई तैनाती के एसएनएस अधिसूचना {स्टेटसकोड: 500, संदेश: "एपीआई अपडेट नहीं किया गया था"}; }} पकड़ (त्रुटि) {const विफलतापराम = = विफलताDetails: {संदेश: error.message, प्रकार: "JobFailed"}, jobId: job.id};
const failureResult = इंतजार करिए codepipeline .putJobFailureResult (विफलतापाराम्स) .प्रोमाइज (); }};

यह लाम्बा क्या कर रहा है इसका एक संक्षिप्त अवलोकन। सबसे पहले, आपको कोडपिपलाइन नौकरी को हथियाने की आवश्यकता होगी क्योंकि फ़ंक्शन के अंत में आपको इस चरण की स्थिति "सफलता" या "विफलता" पर सेट करनी होगी। यदि आप पाइपलाइन में एक डिफ़ॉल्ट लैम्ब्डा को चिपकाते हैं, तो केवल "हैलो वर्ल्ड" स्टेटमेंट मुद्रित होता है, तो आप पाएंगे कि आपकी पाइपलाइन आपके लैम्ब्डा के साथ मंच पर लगभग 20 मिनट के लिए स्टाल करेगी। ऐसा इसलिए है क्योंकि CodePipeline उस स्तर से उस नौकरी की स्थिति अपडेट के बिना आगे नहीं बढ़ सकता है।

फिर, APP आईडी को पकड़ो जिसे आपने CodePipeline स्टेज एक्शन सेटअप के दौरान उपयोगकर्ता पैरामीटर के रूप में पारित किया था। जिस चरण को आप फिर से तैयार करना चाहते हैं, उसे हटाने के लिए एपेटवे sdk का उपयोग करें। हां, तुमने उसे ठीक पढ़ा। फिर, एक नया परिनियोजन और परिनियोजन के लिए एक नया चरण बनाएँ। अंत में, अपडेटस्टेज से हल किए गए वादे के मूल्य पर कब्जा करें, और यदि इसमें एक .deploymentId शामिल है, तो हमें पता है कि हम कोडपिपलाइन को वापस रिपोर्ट कर सकते हैं कि हमारी एपीआईजी तैनाती एक सफलता थी, ताकि हमारी पाइपलाइन जारी रह सके। किसी भी त्रुटि को पकड़ा जाएगा और पाइपलाइन की नौकरी में विफलता होगी।

वैकल्पिक: मैं एक टिप्पणी जोड़ता हूं, लेकिन एक एसएनएस अधिसूचना के लिए कोड शामिल नहीं किया। यह आपके लिए अच्छा होगा कि आप अपनी पाइपलाइन पर सूचनाएँ दें या जब यह लंबोदर त्रुटियां हों, ताकि आप अपनी नई CloudFormation परिनियोजन को अद्यतन करने के बारे में जानें, लेकिन APIG ने ऐसा नहीं किया, जो आपको उसी पूर्वानुमान में छोड़ देगा, जिसे आपने यह सब शुरू किया था।

2 - स्टेज को अपने कोडपिपलीन में जोड़ें

अपने CloudFormation में परिवर्तन चरण निष्पादित करने के बाद एक लैम्ब्डा चरण जोड़ने के लिए अपनी पाइपलाइन को संपादित करें। लैम्ब्डा को एक्शन प्रोवाइडर के रूप में चुनें, हमारे द्वारा अभी बनाए गए लैम्ब्डा का चयन करें, और जिस एपीआई गेटवे को आप तैनात करना चाहते हैं, उसकी आईडी डालें। यदि आप अपने एपीआई गेटवे प्रबंधन कंसोल पर जाते हैं, तो मुख्य पृष्ठ में सूचीबद्ध आईडी हैं।

3 - सुनिश्चित करें कि लैम्ब्डा के पास सही अनुमति है।

आपके APIG तैनाती लाम्बा के लिए IAM भूमिका में शामिल APIG को अनुमति शामिल करने की आवश्यकता होगी (ताकि यह तैनात हो सके) और CodePipeline (ताकि यह काम को अपडेट कर सके)।

4 - अपनी पाइपलाइन का परीक्षण करें

जब आप यह सब सेट कर लेते हैं, तो आगे बढ़ें और परिवर्तन जारी करें या अपना कोड धक्का दें, और पाइपलाइन देखें अपने CloudFormation स्टैक और अपने API गेटवे परिनियोजन को अद्यतन करने की प्रक्रिया को स्वचालित करें।

निष्कर्ष

यह थोड़ा मज़ेदार है कि CloudFormation हमारे लिए यह पहले से ही हैंडल नहीं करता है। शायद किसी दिन यह होगा।

पुन: संक्षिप्त करने के लिए, हमने CloudFormation द्वारा परिनियोजन के लिए बाध्य करने के लिए आपके टेम्पलेट में APIG संसाधन नाम को अद्यतन करने के समाधान पर चर्चा की। हमने यह भी देखा कि कैसे आप अपने APIG को फिर से तैयार करने के लिए कोडपिपलीन और लैम्बडा का उपयोग करके प्रक्रिया को स्वचालित कर सकते हैं।

पढ़ने के लिए धन्यवाद, और इस तरीके को हल करने के तरीकों, मेरे दृष्टिकोण या अन्य विचारों में सुधार के बारे में प्रतिक्रिया देने के लिए स्वतंत्र महसूस करें।