2016-01-11 27 views
10

मैंने सरल लैम्ब्डा फ़ंक्शन और upload एडब्ल्यूएस लैम्ब्डा को बनाया है।एडब्ल्यूएस लैम्ब्डा: सरल जावा क्लास से लैम्ब्डा फ़ंक्शन को कैसे कॉल करें

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 

public class Hello implements RequestHandler<String, String> { 

    @Override 
    public String handleRequest(String input, Context context) { 
     String output = "Bonjour, " + input + "!"; 
     return output; 
    } 

} 

} 

मैं जावा क्लास का उपयोग करके किसी अन्य परियोजना से इस लैम्ब्डा फ़ंक्शन को आमंत्रित करना चाहता हूं। मैं फ़ंक्शन को कॉल करने के लिए aws-java-sdk-lambda-1.10.22 का उपयोग कर रहा हूं। लेकिन मैं उसमें सफल नहीं हूं।

यहां मेरा InvokeLambda क्लास है जो एक अलग परियोजना है।

import java.nio.ByteBuffer; 
import java.nio.charset.Charset; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import com.amazonaws.auth.AWSCredentials; 
import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.regions.Region; 
import com.amazonaws.regions.Regions; 
import com.amazonaws.services.lambda.AWSLambdaClient; 
import com.amazonaws.services.lambda.model.InvokeRequest; 

public class InvokeLambda { 
    private static final Log logger = LogFactory.getLog(InvokeLambda.class); 
    private static final String awsAccessKeyId = "XXXXXX"; 
    private static final String awsSecretAccessKey = "YYYY"; 
    private static final String regionName = "us-west-2"; 
    private static final String functionName = "Hello"; 
    private static Region region; 
    private static AWSCredentials credentials; 
    private static AWSLambdaClient lambdaClient; 

    /** 
    * The entry point into the AWS lambda function. 
    */ 
    public static void main(String... args) { 
     credentials = new BasicAWSCredentials(awsAccessKeyId, 
       awsSecretAccessKey); 

     lambdaClient = (credentials == null) ? new AWSLambdaClient() 
       : new AWSLambdaClient(credentials); 
     //lambdaClient.configureRegion(Regions.US_WEST_2); 
     region = Region.getRegion(Regions.fromName(regionName)); 
     lambdaClient.setRegion(region); 

     try { 
      InvokeRequest invokeRequest = new InvokeRequest(); 
      invokeRequest.setFunctionName(functionName); 
      invokeRequest.setPayload("\" AWS Lambda\""); 
      System.out.println(byteBufferToString(
        lambdaClient.invoke(invokeRequest).getPayload(), 
        Charset.forName("UTF-8"))); 
     } catch (Exception e) { 
      logger.error(e.getMessage()); 
      // System.out.println(e.getMessage()); 

     } 
    } 

    public static String byteBufferToString(ByteBuffer buffer, Charset charset) { 
     byte[] bytes; 
     if (buffer.hasArray()) { 
      bytes = buffer.array(); 
     } else { 
      bytes = new byte[buffer.remaining()]; 
      buffer.get(bytes); 
     } 
     return new String(bytes, charset); 
    } 
} 

जावा का उपयोग करके लैम्ब्डा फ़ंक्शन को कैसे कॉल करें?

+0

आपको वास्तव में क्या समस्या है? क्या आपने InvokeLambda प्रोग्राम चलाने का प्रयास किया है? यह मेरे लिए सही लग रहा है। –

+0

@ जो टेलर: हाँ मैंने कक्षा चलाने की कोशिश की। {, "ERRORTYPE" "errorMessage": "com.aws.HelloLambda क्लास नहीं मिला": "वर्ग java.lang.ClassNotFoundException"} मैं हो रही है त्रुटि – Unknown

उत्तर

8

आपकी टिप्पणी में दी गई जानकारी को देखते हुए, आपके ग्राहक कोड को फ़ंक्शन का आह्वान करने के लिए ठीक है। समस्या स्वयं फ़ंक्शन की कॉन्फ़िगरेशन के साथ प्रतीत होती है। विशेष रूप से, एडब्ल्यूएस लैम्ब्डा हैंडलर आपने उल्लेख किया है (com.aws.HelloLambda::handleRequest), क्योंकि उस नाम और अपने हैंडलर वर्ग (Hello) और उस वर्ग (handleRequest) में विधि के नाम का पैकेज से मेल नहीं खाता नहीं मिल पाई है।

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

शायद आप इसे com.aws.HelloLambda::handleRequest से Hello::handleRequest पर बदलना चाहते हैं।

example of how to update the Handler name in the console

अपने जावा ग्राहक से समारोह का परीक्षण करने से पहले, आप इसे सीधे कंसोल के माध्यम से परीक्षण कर सकते हैं, यह आप सुनिश्चित समारोह सही तरीके से कॉन्फ़िगर में मदद मिलेगी।

1

जावा कोड से लैम्ब्डा आह्वान करने के लिए एक और तरीका है LambdaInvokerFactory उपयोग करने के लिए है और मैं इस दृष्टिकोण क्लीनर पाया।

  1. इंटरफेस को परिभाषित करें अपने समारोह का प्रतिनिधित्व करने और @LambdaFunction
  2. साथ विधि व्याख्या LambdaInvokerFactory
  3. आह्वान लैम्ब्डा समारोह (इंटरफेस कार्यान्वयन अभी बनाया प्रॉक्सी वस्तु का उपयोग कर का उपयोग करके उपरोक्त इंटरफ़ेस के कार्यान्वयन बनाएँ: आप निम्न कार्य करने की जरूरत है)

    अधिक विस्तृत उदाहरण here पाया जा सकता है।

+0

मैं कहूंगा कि इस दृष्टिकोण के साथ समस्या यह है कि यह Jackon और अपने इनपुट का उपयोग करता है डेटा जैकसन चाहता है जिस तरह से पालन करने की जरूरत है। आप अपने खुद के json serializer उपयोग करना चाहते हैं यह संभव नहीं है। यदि आपके डेटा में जटिल डेटाटाइप हैं तो मैं कहूंगा कि InvokeRequest के साथ जाएं। – paramupk

+0

हाँ, अगर आपको अधिक स्वतंत्रता की आवश्यकता है तो InvokeRequest आपका मित्र होगा। – isaranchuk

संबंधित मुद्दे