क्या AWS लाम्बा फंक्शन दूसरे को बुला सकता है


320

मेरे पास 2 लैम्ब्डा फ़ंक्शन हैं - एक जो एक उद्धरण पैदा करता है और एक जो एक ऑर्डर में एक उद्धरण को बदलता है। मैं ऑर्डर लैंबडा फंक्शन को कोट रिजनरेट करने के लिए क्वैस्ट फंक्शन को कॉल करना चाहता हूं, बजाए इसके कि इसे किसी अनलॉक्ड क्लाइंट से प्राप्त करें।

मैंने हर जगह देखा है जिसके बारे में मैं सोच सकता हूं - लेकिन यह नहीं देख सकता कि कैसे मैं कार्यों को पूरा करने या कॉल करने के बारे में जाऊंगा ... निश्चित रूप से यह मौजूद है!


1
मैं यहाँ पहुँच रहा हूँ, लेकिन आप पहले लैम्ब्डा फ़ंक्शन में AWS जावास्क्रिप्ट SDK पर निर्भर क्यों नहीं हो सकते, AWS.Lambda क्लाइंट बनाएं और दूसरे फ़ंक्शन को लागू करें?
डेवोनलाज़रस

यह वही है जो मैं करने की कोशिश कर रहा था - लेकिन मुझे पूरी तरह से यकीन नहीं था कि इसके बारे में कैसे जाना जाए, क्योंकि यह एक और लैम्बडा फ़ंक्शन से करने का कोई उदाहरण नहीं था।
सिल्वर

1
जाहिरा तौर पर आप HTTP के माध्यम से एक लैम्ब्डा फ़ंक्शन को भी आमंत्रित कर सकते हैं ।
देवोनलारजस

4
और एक और विचार, आप उन्हें एसएनएस के माध्यम से चेन कर सकते हैं , जो संभवत: इस तरह से मैं एक और अधिक स्केलेबल रणनीति के रूप में
जाऊंगा

6
एक अन्य सामान्य विकल्प जिसका उल्लेख यहां नहीं किया जा रहा है, वह है स्टेप फंक्शंस या एसडब्ल्यूएफ।
लेब्रायंट

जवाबों:


365

मुझे इसका उपयोग करने का एक तरीका मिला aws-sdk

var aws = require('aws-sdk');
var lambda = new aws.Lambda({
  region: 'us-west-2' //change to your region
});

lambda.invoke({
  FunctionName: 'name_of_your_lambda_function',
  Payload: JSON.stringify(event, null, 2) // pass params
}, function(error, data) {
  if (error) {
    context.done('error', error);
  }
  if(data.Payload){
   context.succeed(data.Payload)
  }
});

आप यहां डॉक पा सकते हैं: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html


28
एसएनएस का उपयोग करना शायद बेहतर दृष्टिकोण है, लेकिन यह सही उत्तर है।
रजत

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

81
मैं InvocationType: 'Event'पैरामीटर ( धन्यवाद के बाद FunctionNameऔर Payload) में काम करने के लिए इसे प्राप्त करने में सक्षम था । डॉक्स से: "आप वैकल्पिक रूप से इन्वोकेशन टाइप के रूप में घटना को निर्दिष्ट करके अतुल्यकालिक निष्पादन का अनुरोध कर सकते हैं।" Async निष्पादन के साथ, कॉलबैक फ़ंक्शन को मज़बूती से कॉल किया जाएगा, लेकिन निष्पादित लैम्ब्डा की प्रतीक्षा करने के लिए निष्पादन को समाप्त किए बिना।
एलेसेंड्रो

25
ध्यान दें कि कॉलिंग लंबो फंक्शन की भूमिका में IAM पॉलिसी शामिल करना आवश्यक है AWSLambdaRole। या, आप अपनी भूमिका की मौजूदा नीति में निम्न कथन ऑब्जेक्ट जोड़ सकते हैं: '{"प्रभाव": "अनुमति दें", "क्रिया": ["लंबोदर: चालान", "संसाधन": ["*"]} `
बॉब अरलॉफ

4
वास्तव में AWS ने StepFunctions को जारी किया जो आपको एक लैम्ब्डा को दूसरे लैम्ब्डा से इनवाइट किए बिना कई लैम्ब्डा को कॉल करने की अनुमति देता है, ताकि वह यानी। पहला वाला दूसरे के खत्म होने का "इंतजार" नहीं करता
सेबस्टियन एच।

116

आपको अपने Lambda functionsमाध्यम से श्रृंखला बनानी चाहिए SNS। यह दृष्टिकोण न्यूनतम प्रयास के लिए अच्छा प्रदर्शन, विलंबता और मापनीयता प्रदान करता है।

आपका पहला Lambdaआपके लिए संदेश प्रकाशित करता है SNS Topicऔर दूसरा Lambdaइस विषय पर सब्सक्राइब किया जाता है। जैसे ही संदेश विषय में आते हैं, दूसरा Lambdaसंदेश के साथ निष्पादित हो जाता है क्योंकि यह इनपुट पैरामीटर है।

Amazon SNS नोटिफिकेशन का उपयोग करके लैम्ब्डा फंक्शन्स को देखें ।

आप इस दृष्टिकोण का उपयोग SNS के माध्यम से क्रॉस-अकाउंट लैंबडा कार्यों को लागू करने के लिए भी कर सकते हैं ।


2
किनेसिस थोड़ा अधिक जटिल हो सकता है, लेकिन यदि आप अधिक मजबूत समाधान देख रहे हैं, तो यह आपके लिए एक अच्छा विकल्प हो सकता है। इसके अलावा, SNS आने वाली घटनाओं को संग्रहीत नहीं करता है, Kinesis करता है।
किक्सॉर्ज

7
"आपको एसएनएस के माध्यम से अपने लम्बे कार्यों को श्रृंखलाबद्ध करना चाहिए" - क्या आप डॉक्स के लिए सबूत / लिंक के साथ इसका समर्थन कर सकते हैं? मैं देखता हूं कि दोनों तरीके कैसे काम करेंगे, मुझे कुछ राय / निश्चित बयान देखने में दिलचस्पी होगी, जिस पर एक पसंदीदा एक है
क्लाउड

30
यह एक अच्छा विचार है यदि आपको इसे अतुल्यकालिक होने की आवश्यकता है। लेकिन अगर आपके पहले लैम्ब्डा फ़ंक्शन को दूसरे लैम्ब्डा से दिए गए मान की आवश्यकता है, तो आपको लैम्ब्डा को चेन करना होगा और पहले लैम्ब्डा फ़ंक्शन को सीधे दूसरे लैम्ब्डा फ़ंक्शन को इनवॉइस करना होगा।
नोएल लेवलेरेस

3
मैं एसएनएस का उपयोग करने की सिफारिश नहीं करूंगा। आप बस लैम्ब्डा फ़ंक्शन के लिए अतुल्यकालिक इन्वोकेशन एपीआई का उपयोग कर सकते हैं-एसएनएस का उपयोग करने का कोई कारण नहीं जब तक आप कई ग्राहकों को सूचित नहीं करना चाहते हैं और न ही किसी अन्य लैम्बडा फ़ंक्शन को ट्रिगर करना चाहते हैं।

6
ध्यान रखें कि एसएनएस के पास डिलीवरी की गारंटी नहीं है, इसलिए आप संदेश को आग लगा सकते हैं, लेकिन यह नहीं आ सकता है।
बार्ट वैन रेमॉर्टेल

79

यहाँ अजगर के लिए एक नमूना कोड है,

from boto3 import client as boto3_client
from datetime import datetime
import json

lambda_client = boto3_client('lambda')

def lambda_handler(event, context):
    msg = {"key":"new_invocation", "at": datetime.now()}
    invoke_response = lambda_client.invoke(FunctionName="another_lambda_",
                                           InvocationType='Event',
                                           Payload=json.dumps(msg))
    print(invoke_response)

Btw, आपको अपनी लैम्बडा भूमिका के साथ भी इस तरह की एक नीति जोड़ने की आवश्यकता होगी

   {
        "Sid": "Stmt1234567890",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": "*"
    }

प्रलेखन लगता है कि पेलोड को JSON होना चाहिए। क्या बाइनरी डेटा भेजना संभव है?
mbatchkarov

2
मैं इस विधि को भी पसंद करता हूं, लेकिन यह एक गड़बड़ है। आपको datetime.now()एक स्ट्रिंग में बदलने की आवश्यकता होगी (या इसे किसी तरह से संभालना होगा)। अन्यथा, आपको त्रुटि मिलती हैdatetime.datetime(2017, 9, 11, 14, 40, 53, 23834) is not JSON serializable
जॉन सी।

क्या पहले मेमने की भूमिका में अधिक प्रतिबंधात्मक होना संभव है? यानी, किसी भी और सभी के बजाय, विशिष्ट कार्यों को लागू करने के लिए इसे टाई करने के लिए ?
फिल

@ हो सकता है कि "संसाधन" फ़ील्ड को केवल विशिष्ट कार्यों के सेट की अनुमति देने के लिए सेट किया जा सकता है, मुझे पूरी तरह से यकीन नहीं है कि
ब्लूस्किन

2
InvocationTypeहोना चाहिए: RequestResponse। लैम्बडा से प्रतिक्रिया प्राप्त करने के लिए जिसे आप आह्वान करने की कोशिश कर रहे हैं।
ambigus9

31

चूंकि यह सवाल पूछा गया था, इसलिए अमेज़ॅन ने स्टेप फंक्शंस ( https://aws.amazon.com/step-functions/ ) जारी किया है ।

AWS लैम्ब्डा के पीछे मूल सिद्धांतों में से एक यह है कि आप व्यावसायिक तर्क पर अधिक ध्यान केंद्रित कर सकते हैं और अनुप्रयोग तर्क पर कम कर सकते हैं जो इसे एक साथ जोड़ता है। चरण कार्य आपको इसे करने के लिए कोड लिखने के बिना फ़ंक्शन के बीच जटिल इंटरैक्शन को ऑर्केस्ट्रेट करने की अनुमति देता है।


12

यह समाधान boto3 और पायथन का उपयोग करके किया जाता है:

import boto3
import json

invokeLambda = boto3.client('lambda', region_name='eu-west-1')

def lambda_handler(event, context):
    invokeLambda.invoke(FunctionName = 'function_name', InvocationType = 'RequestResponse', Payload = json.dumps(event))

    return True

2
InvocationType निम्नलिखित विकल्पों में से चुनें। RequestResponse (डिफ़ॉल्ट) - फ़ंक्शन को सिंक्रोनाइज़ करें। फ़ंक्शन को तब तक खुला रखें जब तक कि फ़ंक्शन प्रतिक्रिया या समय नहीं लौटाता। घटना - फ़ंक्शन को अतुल्यकालिक रूप से शामिल करें। फ़ंक्शन की मृत-पत्र कतार (यदि कॉन्फ़िगर किया गया है) में कई बार विफल होने वाली घटनाओं को भेजें। DryRun - पैरामीटर मानों को सत्यापित करें और सत्यापित करें कि उपयोगकर्ता या भूमिका को फ़ंक्शन को लागू करने की अनुमति है।
त्रिलोक नागवेंकर

11

मैं SNS को काटने से देख रहा था जब तक कि मैंने लैम्ब्डा क्लाइंट डॉक्स (जावा संस्करण) में इसे नहीं देखा :

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

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


17
InvocationType = 'Event' इसे Async बनाता है। docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…
अंकित

3
@Ankit जो चयनित उत्तर होना चाहिए, मुझे यह विश्वास करने के लिए भ्रमित किया गया था कि एसएनएस का उपयोग करना एक अतुल्यकालिक आह्वान करने का एकमात्र तरीका था क्योंकि किसी ने भी इस जानकारी के साथ जवाब नहीं दिया।

@Ankit क्या आप InvocationType = 'Event' का उपयोग करके एक उदाहरण के बारे में जानते हैं लेकिन जावास्क्रिप्ट के बजाय जावा से? जावा प्रलेखन का एक टन है, लेकिन लगभग
21-16 पर

SNS अभी भी इसके उपयोग के लिए लागत जोड़ता है
सेबस्टियन एच।

1
@SebastienH। SNS को लैंबडा के लिए आमंत्रित करने की कोई कीमत नहीं है। aws.amazon.com/sns/pricing
fabdouglas

8

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

  • एक उद्धरण पैदा करने के लिए
  • एक आदेश में एक उद्धरण बदल जाता है

आप नीचे के रूप में आसानी से कर सकते हैं:

यहां आपके पास एक उद्धरण के लिए पहला राज्य हो सकता है और दूसरा क्रम में बदल सकता है

{
  Comment: "Produce a quote and turns into an order",
  StartAt: "ProduceQuote",
  States: {
    ProduceQuote: {
      "Type": Task,
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote",
      "next": TurnsToOrder
    }
    TurnsToOrder: {
      Type: Task,
      Resource: "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote",
      end: true
    }
  }
}

स्टेप फ़ंक्शंस कई लंबो कार्यों को लिखना और अनुक्रम में या समानांतर में चलाना वास्तव में आसान बनाता है। आप लैम्ब्डा स्टेप फंक्शन्स के बारे में अधिक जानकारी यहाँ प्राप्त कर सकते हैं: स्टेप्स फंक्शन्स


5

मैं द्वारा प्रदान की जवाब के साथ काम कर रहा था blueskin लेकिन मुझे नहीं क्योंकि पेलोड प्रतिक्रिया पढ़ सकता है InvocationType = 'घटना' है async तो मैं InvocationType = 'RequestResponse' के रूप में बदल गया है और अब सब अच्छा काम करता है।


5

जावा में, हम निम्नानुसार कर सकते हैं:

AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();

InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);

InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

यहाँ, पेलोड आपकी कड़ी जावा वस्तु है जिसे जैंस ऑब्जेक्ट के रूप में किसी अन्य लैम्ब्डा में पारित करने की आवश्यकता होती है यदि आपको लैम्ब्डा को कॉल करने से लेम्बडा नामक कुछ जानकारी पास करने की आवश्यकता होती है।



2

आप AWSLambdaClientएडब्ल्यूएस ब्लॉग पोस्ट में वर्णित के रूप में उपयोग करके सीधे (कम से कम जावा के माध्यम से) लंबा फ़ंक्शन को लागू कर सकते हैं ।


2

मुझे वही समस्या हो रही है लेकिन लैंबडा फ़ंक्शन जिसे मैं कार्यान्वित करता हूं वह डायनमोबडी में एक प्रविष्टि सम्मिलित करेगा, इसलिए मेरा समाधान डायनमोडी ट्रिगर का उपयोग करता है।

मैं तालिका में प्रत्येक प्रविष्टि / अद्यतन के लिए DB लैंबडा फ़ंक्शन को आमंत्रित करता हूं, इसलिए यह दो लैम्ब्डा कार्यों के कार्यान्वयन को अलग करता है।

प्रलेखन यहाँ है: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

यहाँ एक निर्देशित वॉकथ्रू है: https://aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/


1

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

यदि आप एक POST अनुरोध सेटअप नहीं करना चाहते हैं, तो आप बस एक जोड़े के साथ एक साधारण GET अनुरोध सेट कर सकते हैं, या कोई भी नहीं, आसान इवेंट पासिंग के लिए क्वेरी स्ट्रिंग पैरामीटर।

- संपादित करें -

देखें: https://docs.aws.amazon.com/apigateway/api-reference/making-http-recests/

और: http://docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https-example.html


1
यह एसएनएस की तुलना में बहुत कम गोल चक्कर लगता है, लेकिन फिर मुझे एसएनएस का उपयोग करने का बहुत अनुभव नहीं है
ब्रैंडन

क्या आप एक लैम्बडा के भीतर से एपीआई एंडपॉइंट को कॉल करने के लिए आवश्यक कोड साझा कर सकते हैं?
ग्लेन

@ यह केवल एक अजाक्स अनुरोध है। अपने मापदंडों पर टैग करें जिन्हें आपको क्वेरी पैरामीटर के रूप में आवश्यक है। देखें: docs.aws.amazon.com/apigateway/api-reference/… और docs.aws.amazon.com/lambda/latest/dg/…
Anselm

4
एक और समस्या यह है कि एपीआई गेटवे से गुजरना एक और लैंबडा फ़ंक्शन को कॉल करने की तुलना में अपेक्षाकृत महंगा है। 100ms (न्यूनतम) के लिए चल रहे एक 128MB फ़ंक्शन की लागत 1 मिलियन कॉल प्रति $ 0.21 है, जबकि एपीआई गेटवे की लागत $ 3.50 प्रति 1 मिलियन है। जाहिर है, यदि आप अधिक समय के लिए चल रहे हैं या आप अधिक रैम का उपयोग करते हैं, तो आपको 21 सेंट गुणा करना होगा, लेकिन फिर भी, $ 3.50 प्रति मिलियन वास्तव में महंगा है। (ये कीमतें अगस्त 2017 तक प्रभावी थीं)
पैट्रिक चू

1

दूसरों ने SQS और स्टेप फ़ंक्शंस का उपयोग करने के लिए कहा। लेकिन ये दोनों समाधान अतिरिक्त लागत जोड़ते हैं। चरण समारोह राज्य संक्रमण माना जाता है कि बहुत महंगा है।

AWS लैम्ब्डा कुछ रिट्री लॉजिक प्रदान करता है। जहां यह 3 बार कुछ करने की कोशिश करता है। मुझे यकीन नहीं है कि यदि आप अभी भी मान्य हैं जब आप इसे एपीआई का उपयोग करते हैं।


0

यहाँ एक और लंबो फंक्शन को बुलाने का अजगर उदाहरण है और इसे अपनी प्रतिक्रिया मिलती है। दो मंगलाचरण प्रकार 'RequestResponse' और 'घटना' है । यदि आप लैम्ब्डा फ़ंक्शन की प्रतिक्रिया प्राप्त करना चाहते हैं और 'इवेंट' का उपयोग असंगत रूप से लैम्ब्डा फ़ंक्शन को प्राप्त करने के लिए 'रिक्वेन्सरशिप' का उपयोग करें। तो अतुल्यकालिक और तुल्यकालिक दोनों तरीके उपलब्ध हैं।

    lambda_response = lambda_client.invoke(
                FunctionName = lambda_name,
                InvocationType = 'RequestResponse',
                Payload = json.dumps(input)
                )
    resp_str = lambda_response['Payload'].read()
    response = json.loads(resp_str)

-1

आप AWS_REGION वातावरण सेट कर सकते हैं।

assert(process.env.AWS_REGION, 'Missing AWS_REGION env (eg. ap-northeast-1)');
const aws = require('aws-sdk');
const lambda = new aws.Lambda();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.