কোনও এডাব্লুএস ল্যাম্বদা ফাংশন অন্যকে কল করতে পারে


320

আমার কাছে দুটি লাম্বদা ফাংশন রয়েছে - একটি যা একটি উদ্ধৃতি উত্পাদন করে এবং একটি যা একটি উদ্ধৃতিটিকে একটি ক্রমে পরিণত করে। আমি অর্ডার ল্যাম্বডা ফাংশনটি চাই যাতে কোট ফাংশনটি কল করা পুনরায় উত্সাহিত করার জন্য, কেবলমাত্র অবিশ্বস্ত ক্লায়েন্টের কাছ থেকে এটি গ্রহণ করা।

আমি যেখানেই ভাবতে পারি সেদিকে নজর রেখেছি - তবে কীভাবে শৃঙ্খলাবদ্ধ বা ফাংশনগুলি কল করার বিষয়ে আমি যাব তা দেখতে পাচ্ছি না ... অবশ্যই এটি বিদ্যমান!


1
আমি এখানে পৌঁছে যাচ্ছি, তবে কেন আপনি প্রথম লাম্বদা ফাংশনে অ্যাডাব্লুএস জাভাস্ক্রিপ্ট এসডিকে নির্ভর করতে পারেন না, একটি এডাব্লুএস.লাম্বা ক্লায়েন্ট তৈরি করতে এবং দ্বিতীয় ক্রিয়াকলাপটি শুরু করতে পারেন?
ডিভনলজারাস

এটি আমি চেষ্টা করতে যাচ্ছিলাম - তবে এটি সম্পর্কে কীভাবে যাব আমি পুরোপুরি নিশ্চিত ছিলাম না, কারণ লাম্বার অন্য কোনও ফাংশন থেকে এটি করার কোনও উদাহরণ নেই।
রৌপ্য

1
স্পষ্টতই আপনি এইচটিটিপি-র মাধ্যমে ল্যাম্বডা ফাংশনও চালাতে পারেন ।
ডিভনলজারাস

4
এবং আরও একটি ধারণা, আপনি তাদের এসএনএসের মাধ্যমে চেইন করতে পারেন , সম্ভবত এটিই আমি আরও স্কেলযোগ্য কৌশল হিসাবে যাব
ডিভনলজারাস

6
অন্য সাধারণ বিকল্পগুলি এখানে উল্লেখ করা হচ্ছে না তা হ'ল স্টেপ ফাংশনস বা এসডাব্লুএফ।
lebryant

উত্তর:


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)। দস্তাবেজগুলি থেকে: "আপনি ইভেন্টটি ইনভোকেশনটাইপ হিসাবে উল্লেখ করে বৈকল্পিকভাবে অ্যাসিনক্রোনাস মৃত্যুর জন্য অনুরোধ করতে পারেন" অ্যাসিঙ্ক এক্সিকিউশন সহ, কলব্যাক ফাংশনটি নির্ভরযোগ্যভাবে কল করা হবে, তবে চালানো শেষ করার জন্য নিমন্ত্রিত ল্যাম্বদা অপেক্ষা না করে।
আলেসান্দ্রো

25
নোট করুন যে কলিং ল্যাম্বদা ফাংশনের ভূমিকার জন্য আইএএম নীতি অন্তর্ভুক্ত করা দরকার AWSLambdaRole। বা, আপনি নীচের বিবৃতিটি আপনার ভূমিকার বিদ্যমান নীতিতে যুক্ত করতে পারেন: 'Eff "প্রভাব": "অনুমতি দিন", "ক্রিয়া": ["ল্যাম্বদা: ইনভোক ফাংশন"], "রিসোর্স": ["*"]} `
বব আরলফ

4
প্রকৃতপক্ষে এডাব্লুএস স্টেফফিউশনগুলি প্রকাশ করেছে যা আপনাকে অন্য ল্যাম্বদা থেকে ল্যাম্বডা না করেই একাধিক ল্যাম্বডাকে কল করতে দেয়, যাতে করে। প্রথমটি দ্বিতীয়টির
সমাপ্তির

116

আপনার Lambda functionsমাধ্যমে চেইন করা উচিত SNS। এই পদ্ধতিটি ন্যূনতম প্রচেষ্টার জন্য ভাল পারফরম্যান্স, বিলম্ব এবং স্কেলিবিলিটি সরবরাহ করে।

আপনার প্রথমটি Lambdaআপনার বার্তাগুলি প্রকাশ করে SNS Topicএবং দ্বিতীয়টি Lambdaএই বিষয়ে সাবস্ক্রাইব হয়েছে। বিষয়গুলি বার্তাগুলি আসার Lambdaসাথে সাথে দ্বিতীয়টি ইনপুট প্যারামিটার হিসাবে বার্তাটি দিয়ে কার্যকর করা হবে।

অ্যামাজন এসএনএসের বিজ্ঞপ্তিগুলি ব্যবহার করে ল্যাম্বদা ফাংশনগুলি চালু করা দেখুন ।

আপনি এসএনএসের মাধ্যমে ক্রস অ্যাকাউন্ট লাম্বদা ফাংশনগুলি আহ্বান করতে এই পদ্ধতির ব্যবহার করতে পারেন ।


2
কেইনিসিস কিছুটা জটিল হতে পারে তবে আপনি যদি আরও দৃ solution় সমাধানের দিকে তাকান তবে তা আপনার পক্ষে ভাল বিকল্প হতে পারে। এছাড়াও, এসএনএস আগত ইভেন্টগুলি সঞ্চয় করে না, কিনেসিস করেন।
কিক্সরজ

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)

বিটিডব্লিউ, আপনার ল্যাম্বডা ভূমিকার সাথে আপনার মতো নীতি যুক্ত করতে হবে

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

ডকুমেন্টেশনটি মনে করে যে পে-লোড অবশ্যই জেএসএন হবে। বাইনারি ডেটা পাঠানো কি সম্ভব?
এমবাচকরভ

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-funifications/ )।

এডাব্লুএস ল্যাম্বদার পিছনের মূল নীতিগুলির মধ্যে একটি হ'ল আপনি ব্যবসায়িক যুক্তিতে আরও মনোনিবেশ করতে পারেন এবং অ্যাপ্লিকেশন লজিকের সাথে কমিয়ে ফেলতে পারেন যা এগুলি একে অপরের সাথে যুক্ত করে। পদক্ষেপ ফাংশন আপনাকে কোডটি না লিখেই ফাংশনগুলির মধ্যে জটিল ইন্টারঅ্যাক্ট অর্কেস্টেট করার অনুমতি দেয়।


12

এই সমাধানটি বোটো 3 এবং পাইথন ব্যবহার করে করা হয়:

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
ইনভোকেশনটাইপ নিম্নলিখিত বিকল্পগুলি থেকে বেছে নিন। RequestResponse (ডিফল্ট) - সমকালীনভাবে ফাংশনটি আহ্বান করুন। ফাংশনটির কোনও প্রতিক্রিয়া বা সময় শেষ না হওয়া পর্যন্ত সংযোগটি খোলা রাখুন। ইভেন্ট - সংশ্লেষজনকভাবে ফাংশনটি আহ্বান করুন। ফাংশনের ডেড-লেটার কাতারে (কনফিগার করা থাকলে) একাধিকবার ব্যর্থ হওয়া ইভেন্টগুলি প্রেরণ করুন। ড্রাইআরুন - প্যারামিটারের মানগুলি যাচাই করুন এবং যাচাই করুন যে ব্যবহারকারীর বা ভূমিকার কাছে ফাংশনটি চালানোর অনুমতি রয়েছে verify
ত্রিলোক নাগভেঙ্কর

11

লাম্বদা ক্লায়েন্ট ডক্সে (জাভা সংস্করণ) এ না পাওয়া পর্যন্ত আমি এসএনএস কেটে রাখার দিকে চেয়ে ছিলাম :

এডাব্লুএস ল্যাম্বদা অ্যাক্সেসের জন্য ক্লায়েন্ট। এই ক্লায়েন্টটি ব্যবহার করে করা সমস্ত পরিষেবা কলগুলি অবরুদ্ধ করছে, এবং পরিষেবা কল শেষ না হওয়া পর্যন্ত ফিরে আসবে না।

সুতরাং এসএনএসের একটি সুস্পষ্ট সুবিধা রয়েছে: এটি অবিচ্ছিন্ন। আপনার ল্যাম্বদা পরবর্তী ল্যাম্বদাটি শেষ হওয়ার অপেক্ষা করবে না।


17
ইনভোকেশনটাইপ = 'ইভেন্ট' এটিকে অ্যাসিঙ্ক করে। docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…
অঙ্কিত

3
@ অঙ্কিত যা নির্বাচিত উত্তর হওয়া উচিত, এসএনএস ব্যবহার করা হ'ল অ্যাসিঙ্ক্রোনাস আহ্বান করার একমাত্র উপায় হ'ল কারণ এই তথ্যের সাথে কেউ উত্তর দেয়নি।

@ অংকিত আপনি কী এনভোকেশনটাইপ = 'ইভেন্ট' ব্যবহার করে জাভাস্ক্রিপ্টের পরিবর্তে জাভা থেকে একটি উদাহরণ জানেন? জাভা নথিপত্রের এক টন রয়েছে, তবে জাভাস্ক্রিপ্টের মতো প্রায় উদাহরণ নেই
টালাডোর 12

এসএনএস এখনও এর ব্যবহারের জন্য ব্যয় যোগ করে
সেবাস্তিয়ান এইচ

1
@SebastienH। এসএনএস ল্যাম্বডাকে ডাকার জন্য কোনও মূল্য নেই। aws.amazon.com/sns/pricing
ফেবডগ্লাস

8

অ্যামাজন ২০১ 2016 সালে এডাব্লুএস ল্যাম্বডায় পদক্ষেপের ক্রিয়াকলাপ চালু করেছে think আপনি দুটি ল্যাম্বদা ফাংশন সহ একটি রাষ্ট্রীয় মেশিন তৈরি করতে পারেন:

  • একটি উদ্ধৃতি উত্পাদন
  • একটি অর্ডার একটি উদ্ধৃতি পরিণত

আপনি নীচের মত সহজেই এটি করতে পারেন:

এখানে আপনার প্রথম রাজ্য থাকতে পারে যার জন্য একটি উদ্ধৃতি এবং অন্যটি ক্রমে রূপান্তরিত হয়

{
  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

আমার একই সমস্যা রয়েছে তবে আমি প্রয়োগ করা লাম্বডা ফাংশনটি ডায়নামোডিবিতে একটি এন্ট্রি প্রবেশ করিয়ে দেবে, সুতরাং আমার সমাধানটি ডায়নামোডিবি ট্রিগারগুলি ব্যবহার করে।

আমি টেবিলে প্রতিটি সন্নিবেশ / আপডেটের জন্য ডিবি একটি ল্যাম্বডা ফাংশন প্রার্থনা করি, সুতরাং এটি দুটি লাম্বদা ফাংশনগুলির প্রয়োগকে পৃথক করে।

ডকুমেন্টেশন এখানে: 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

চক্রাকার সমাধানের মতো তবে আমি যখন আমার চেইন করা দরকার তখন আমি কেবল আমার ল্যাম্বদা ফাংশনগুলির জন্য এপিআই এন্ডপয়েন্টটি কল করি। আপনি কোডগুলি অ্যাসিক্রোনাস হতে চান কিনা তা আপনাকে এই সিদ্ধান্ত নিতে দেয় to

আপনি যদি কোনও পোষ্ট অনুরোধ সেটআপ করতে না চান তবে আপনি সহজেই ইভেন্ট দম্পতির জন্য কোনও দম্পতির সাথে একটি সাধারণ জিইটি অনুরোধ সেট করতে পারেন, বা কিছুই নয়, কোয়েরি স্ট্রিং প্যারামিটারগুলি সহজ ইভেন্টে পাস করার জন্য।

- সম্পাদনা করুন -

দেখুন: https://docs.aws.amazon.com/apigateway/api-references/making-http-requests/

এবং: http://docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https-example.html


1
এটি এসএনএসের তুলনায় অনেক কম চতুর্দিকে মনে হয় তবে এসএনএস ব্যবহার করার মতো অভিজ্ঞতা আমার আর নেই
ব্র্যান্ডন

লাম্বডা থেকে কোনও এপিআই এন্ডপয়েন্টে কল করার জন্য প্রয়োজনীয় কোডটি আপনি ভাগ করে নিতে পারেন?
গ্লেন

@ গ্লেন এটি কেবল একটি এজ্যাক্স অনুরোধ। আপনার প্যারামিটারগুলিতে ট্যাগ করুন যা আপনার ক্যোয়ারী প্যারামিটার হিসাবে প্রয়োজন। দেখুন: docs.aws.amazon.com/apigateway/api-references/… এবং docs.aws.amazon.com/lambda/latest/dg/…
অ্যান্সেম

4
আর একটি সমস্যা হ'ল এপিআই গেটওয়ের মধ্য দিয়ে যাওয়া অন্য ল্যাম্বদা ফাংশনটি কল করার তুলনায় তুলনামূলকভাবে ব্যয়বহুল। 100 মিমি (ন্যূনতম) জন্য চলমান একটি 128MB ফাংশনের জন্য প্রতি 1 মিলিয়ন কলগুলিতে $ 0.21 খরচ হয়, যেখানে এপিআই গেটওয়েতে 1 মিলিয়ন প্রতি $ 3.50 খরচ হয়। স্পষ্টতই, আপনি যদি আরও বেশি সময়ের জন্য দৌড়ে থাকেন বা আপনি আরও বেশি ভেড়া ব্যবহার করেন তবে আপনাকে 21 সেন্ট বেশি গুণতে হবে, তবে এখনও, প্রতি মিলিয়ন $ 3.50 সত্যিই ব্যয়বহুল। (এই দামগুলি আগস্ট 2017 এর হিসাবে কার্যকর ছিল)
প্যাট্রিক চু

1

অন্যরা এসকিউএস এবং স্টেপ ফাংশনগুলি ব্যবহার করার জন্য নির্দেশ করেছেন। তবে এই উভয় সমাধানই অতিরিক্ত ব্যয় যুক্ত করে। পদক্ষেপ ফাংশন রাষ্ট্রের রূপান্তরগুলি মনে হয় খুব ব্যয়বহুল।

এডাব্লুএস ল্যাম্বদা কিছু পুনরায় চেষ্টা করার যুক্তি সরবরাহ করে। যেখানে এটি 3 বারের জন্য কিছু চেষ্টা করে। আমি নিশ্চিত নই যে আপনি যখন এপিআই ব্যবহার করেন তখন এটি কার্যকর হয় কিনা I


0

অন্য ল্যাম্বদা ফাংশনটি কল করার অজগর উদাহরণ এখানে রয়েছে এবং এর প্রতিক্রিয়া পেয়েছে। দুটি অনুরোধ প্রকার 'অনুরোধের প্রস্তাবনা' এবং 'ইভেন্ট' রয়েছে । আপনি যদি ল্যাম্বদা ফাংশনের প্রতিক্রিয়া পেতে চান এবং 'ল্যাম্বডা ফাংশনটি অবিচ্ছিন্নভাবে আহ্বান করতে' ইভেন্ট 'ব্যবহার করতে চান তবে' রিকোয়েস্টরেসপন্স 'ব্যবহার করুন। সুতরাং অ্যাসিঙ্ক্রোনাস এবং সিঙ্ক্রোনাস উভয় উপায়ে উপলব্ধ।

    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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.