2016-01-11 21 views
10

Ho creato una semplice funzione Lambda e upload in AWS Lambda.AWS Lambda: come chiamare la funzione lambda dalla semplice classe java

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

} 

} 

Voglio richiamare questa funzione Lambda da qualche altro progetto utilizzando la classe java. Sto usando aws-java-sdk-lambda-1.10.22 per chiamare la funzione. Ma non sono in grado di riuscirci.

Ecco la mia classe InvokeLambda che è un progetto separato.

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

Come chiamare la funzione lambda utilizzando java?

+0

Che problema stai avendo esattamente? Hai provato a eseguire il programma InvokeLambda? Mi sembra corretto. –

+0

@JoeTaylor: Sì, ho provato a eseguire la lezione. Sto ricevendo {"errorMessage": "Classe non trovata: com.aws.HelloLambda", "errorType": "classe java.lang.ClassNotFoundException"} errore – Unknown

risposta

8

Dato l'informazione nel tuo commento, il tuo codice cliente per invocare la funzione va bene. Il problema sembra essere con la configurazione della funzione stessa. In particolare, AWS Lambda non è in grado di trovare il gestore specificato (com.aws.HelloLambda::handleRequest) perché non corrisponde al nome e al pacchetto della classe del gestore (Hello) e al nome del metodo in quella classe (handleRequest).

È possibile aggiornare il nome del gestore di funzioni tramite la Console AWS. Scegli la tua funzione, quindi la scheda di configurazione e quindi la proprietà del gestore.

Probabilmente vorrete cambiarlo da com.aws.HelloLambda::handleRequest a Hello::handleRequest.

example of how to update the Handler name in the console

Prima di testare la funzione dal client Java, si potrebbe verificare direttamente attraverso la console, questo vi aiuterà a garantire la funzione sia configurato correttamente.

1

Un altro modo per richiamare lambda dal codice java è utilizzare LambdaInvokerFactory e ho trovato questo approccio più pulito. È necessario effettuare le seguenti operazioni:

  1. Definire un'interfaccia che rappresenta la funzione e il metodo di annotare con @LambdaFunction
  2. Creare implementazione dell'interfaccia sopra utilizzando LambdaInvokerFactory
  3. funzione lambda Invoke utilizzando oggetto proxy appena creato (implementazione di interfaccia)

    Esempio più dettagliato può essere trovato here.

+0

Direi che il problema con questo approccio è che usa jackon e il tuo input i dati devono seguire il modo in cui Jackson vuole. Se si desidera utilizzare il proprio serializzatore json non è possibile. Se i tuoi dati hanno tipi di dati complessi, direi andare con InvokeRequest. – paramupk

+0

Sì, se hai bisogno di più libertà allora InvokeRequest sarà tuo amico. – isaranchuk

Problemi correlati