amazon web services - AWS लैम्ब्डा आह्वान करता है कि एक और लैम्ब्डा फ़ंक्शन को कॉल न करें-Node.js




amazon-web-services aws-lambda (2)

ध्यान दें

मैं दूसरे lambda निष्पादित करने वाले lambda को निष्पादित करूँगा।

टाइमआउट क्यों?

चूंकि VPC पीछे निष्पादक "लॉक" है - सभी इंटरनेट संचार अवरुद्ध हैं।

किसी भी http(s) कॉल के परिणाम का समय समाप्त हो जाता है क्योंकि वे अनुरोध करते हैं कि पैकेट कभी भी गंतव्य तक नहीं पहुंचे।

यही कारण है कि aws-sdk द्वारा किए गए सभी कार्यों का समय समाप्त होता है।

सरल उपाय

यदि निष्पादक का VPC में होना आवश्यक नहीं है - तो बस इसे बाहर रखें, एक lambda VPC बिना भी काम कर सकता है।

एक VPC में lambda पता lambda तब आवश्यक है जब lambda VPC अंदर संसाधनों को बुलाता है।

वास्तविक समाधान

ऊपर कहा गया है, यह निम्नानुसार है कि VPC अंदर स्थित कोई भी संसाधन इंटरनेट तक नहीं पहुँच सकता है - यह सही नहीं है - बस कुछ विन्यास करने की आवश्यकता है।

  1. एक VPC बनाएँ।
  2. 2 सबनेट बनाएं, एक को निजी के रूप में निरूपित किया जाए और दूसरा सार्वजनिक (इन शब्दों को आगे समझाया जाए, पढ़ते रहें)।
  3. एक इंटरनेट गेटवे बनाएं - यह एक वर्चुअल राउटर है जो इंटरनेट पर VPC को जोड़ता है।
  4. नैट गेटवे बनाएं - सार्वजनिक सबनेट चुनें और इसके लिए एक नया elastic IP बनाएं (यह आईपी आपके VPC लिए स्थानीय है) - यह घटक internet-gateway लिए संचार को पाइप करेगा।
  5. 2 रूटिंग टेबल्स बनाएं - एक का नाम पब्लिक और दूसरा प्राइवेट

    1. सार्वजनिक रूटिंग टेबल में, रूट पर जाएं और एक नया मार्ग जोड़ें:

    गंतव्य: 0.0.0.0/0

    लक्ष्य: internet-gateway की आईडी

    1. निजी रूटिंग तालिका में, रूट पर जाएं और एक नया मार्ग जोड़ें:

    गंतव्य: 0.0.0.0/0

    लक्ष्य: nat-gateway की आईडी

    • एक निजी सबनेट एक सबनेट है जो इसकी रूटिंग तालिका में है - internet-gateway लिए कोई मार्ग नहीं है

    • एक सार्वजनिक सबनेट एक सबनेट है जो इसकी रूटिंग तालिका में - internet-gateway लिए एक मार्ग मौजूद है

हमारे यहाँ क्या था?

हमने कुछ इस तरह बनाया:

यह, जो निजी सबनेट में संसाधनों को इंटरनेट से कॉल करने की अनुमति देता है। आप here अधिक प्रलेखन पा सकते हैं।

फ़ंक्शन को लागू करने के सभी अधिकार देने के बाद। मेरा लैंबडा फंक्शन दूसरे फंक्शन को इनवाइट करने में सक्षम नहीं है। हर बार मुझे 30 seconds timeout मुद्दा होने पर टाइमआउट मिल रहा है। ऐसा लग रहा है कि लैम्ब्डा एक और लैम्ब्डा फ़ंक्शन प्राप्त करने में सक्षम नहीं है

मेरे लंबोदर एक ही क्षेत्र में हैं, एक ही नीति, एक ही सुरक्षा समूह .. साथ ही VPC दोनों लंबों में समान हैं। केवल एक चीज अलग है अब लंबोदर फ़ंक्शन है

यहां भूमिका अधिकार हैं

1) AWSLambdaExecute और AWSLambdaBasicExecutionRole बनाया

2) एक लंबोदा फंक्शन बनाया गया जिसे लैम्बडा_TEST कहा जाता है

exports.handler = function(event, context) {
  console.log('Lambda TEST Received event:', JSON.stringify(event, null, 2));
  context.succeed(event);
};

3) यहां एक और फ़ंक्शन है जहां से इसे कहा जाता है।

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var lambda = new AWS.Lambda();

exports.handler = function(event, context) {
 var params = {
   FunctionName: 'Lambda_TEST', // the lambda function we are going to invoke
   InvocationType: 'RequestResponse',
   LogType: 'Tail',
   Payload: '{ "name" : "Arpit" }'
 };

  lambda.invoke(params, function(err, data) {
   if (err) {
    context.fail(err);
   } else {
   context.succeed('Lambda_TEST said '+ data.Payload);
  }
 })
};

से लिया गया संदर्भ: यह लिंक


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

मान लें कि मेरे पास कई लंबदा, ए, बी, सी, डी, ... हैं और मैं चाहूंगा कि ये लैम्बडा प्रत्येक के पास आरडीएस डेटाबेस के लिए क्वेरी एक्सेस हो। इस DB पहुँच के लिए, मुझे डेटाबेस के समान VPC में लैम्ब्डा डालने की आवश्यकता है। लेकिन मुझे A, B, C, D, ... के बीच के विभिन्न लैंबडास भी पसंद हैं। इसलिए मैं अर्पित की समस्या का वर्णन करता हूं।

मैं प्रत्येक लैम्ब्डा को दो लैम्ब्डा में विभाजित करके इस मुद्दे से निपट रहा हूं: एक जो प्रक्रिया प्रवाह पर ध्यान केंद्रित करता है (यानी अन्य लैम्ब्डा को आमंत्रित करना और दूसरे लैम्ब्डा द्वारा आह्वान किया जाना); और दूसरा "वास्तविक" काम करने पर ध्यान केंद्रित करना, जैसे डेटाबेस को क्वेरी करना। इसलिए अब मेरे पास A_flow, B_flow, C_flow, D_flow, ... फ़ंक्शंस हैं; और फ़ंक्शंस A_worker, B_worker, C_worker, D_worker, ... विभिन्न प्रवाह लैंबडास को एक विशिष्ट VPC के लिए "पिन नहीं" किया जाता है, और इस तरह से अन्य लैम्ब्डा को लागू किया जा सकता है। विभिन्न कार्यकर्ता लाम्बदास डेटाबेस के रूप में एक ही VPC में हैं, और DB को क्वेरी कर सकते हैं।

प्रत्येक प्रवाह लैम्ब्डा डीबी के साथ संबंधित कार्यकर्ता लैम्ब्डा के साथ बातचीत का काम "प्रतिनिधि" करता है। यह इस प्रतिनिधिमंडल को कार्यकर्ता लंबोदर के एक समकालिक आह्वान के द्वारा करता है। कार्यकर्ता लंबोदर किसी अन्य मेमने का आह्वान नहीं करता है। (प्रक्रिया प्रवाह ग्राफ के संदर्भ में, कार्यकर्ता लैम्ब्डा टर्मिनल नोड्स हैं।) मेरे स्वयं के सिस्टम में, अन्य प्रवाह लैम्ब्डा द्वारा प्रवाह लैम्ब्डा के इनवोकेशन आमतौर पर अतुल्यकालिक हैं; लेकिन मुझे लगता है कि अगर वे चाहें तो तुल्यकालिक हो सकते हैं।

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





amazon-iam