2016-01-11 21 views
10

aufrufen Ich habe einfache Lambda-Funktion und upload dies zu AWS Lambda.AWS Lambda: Wie Lambda-Funktion von einfachen Java-Klasse

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; 
    } 

} 

} 

Ich möchte diese Lambda-Funktion von einem anderen Projekt mit Java-Klasse aufrufen. Ich verwende aws-java-sdk-lambda-1.10.22, um die Funktion aufzurufen. Aber das gelingt mir nicht.

Hier ist meine InvokeLambda-Klasse, die ein separates Projekt ist.

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); 
    } 
} 

Wie die Lambda-Funktion mit Java aufrufen?

+0

Welches Problem haben Sie genau? Haben Sie versucht, das InvokeLambda-Programm auszuführen? Es sieht für mich richtig aus. –

+0

@JoeTaylor: Ja, ich habe versucht, die Klasse zu leiten. Ich bekomme {"errorMessage": "Klasse nicht gefunden: com.aws.HelloLambda", "errorType": "Klasse java.lang.ClassNotFoundException"} Fehler – Unknown

Antwort

8

Angesichts der Informationen in Ihrem Kommentar ist Ihr Client-Code zum Aufruf der Funktion in Ordnung. Das Problem scheint bei der Konfiguration der Funktion selbst zu liegen. Insbesondere kann AWS Lambda den angegebenen Handler nicht finden (com.aws.HelloLambda::handleRequest), da dieser nicht mit dem Namen und dem Paket Ihrer Handler-Klasse (Hello) und dem Namen Ihrer Methode in dieser Klasse (handleRequest) übereinstimmt.

Sie können den Namen des Funktionshandlers über die AWS-Konsole aktualisieren. Wählen Sie Ihre Funktion, dann die Registerkarte Konfiguration und dann die Eigenschaft Handler.

Wahrscheinlich möchten Sie es von com.aws.HelloLambda::handleRequest zu Hello::handleRequest ändern.

example of how to update the Handler name in the console

Bevor die Funktion von Ihrer Java-Client zu testen, können Sie es direkt über die Konsole testen konnte, dieses Sie richtig ist die Funktion konfiguriert sicherzustellen.

1

Eine andere Möglichkeit, Lambda von Java-Code aufzurufen, ist LambdaInvokerFactory zu verwenden, und ich fand diesen Ansatz sauberer. Sie müssen folgendes tun:

  1. definieren Schnittstelle darstellt, Ihre Funktion und mit Anmerkungen versehen Methode mit @LambdaFunction
  2. erstellen Durchführung der oben genannten Schnittstelle LambdaInvokerFactory
  3. Invoke Lambda-Funktion mit nur erstellt Proxy-Objekt (Interface-Implementierung)

    Ausführlichere Beispiel finden Sie here.

+0

Ich würde sagen, das Problem mit diesem Ansatz ist, dass es jackon und Ihre Eingabe verwendet Daten müssen folgen, wie Jackson will. Wenn Sie Ihren eigenen JSON-Serializer verwenden möchten, ist dies nicht möglich. Wenn Ihre Daten komplexe Datentypen haben, würde ich sagen, gehen Sie mit InvokeRequest. – paramupk

+0

Ja, wenn Sie mehr Freiheit brauchen, dann wird InvokeRequest Ihr Freund sein. – isaranchuk