2016-01-11 24 views
10

Stworzyłem prostą funkcję Lambda i upload dla AWS Lambda.AWS Lambda: Jak wywołać funkcję lambda z prostej klasy java

Chcę wywołać tę funkcję Lambda z innego projektu przy użyciu klasy Java. Używam aws-java-sdk-lambda-1.10.22 do wywoływania funkcji. Ale nie mogę tego osiągnąć.

Oto moja klasa InvokeLambda, która jest osobnym projektem.

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

Jak wywołać funkcję lambda za pomocą Java?

+0

Jaki masz problem? Czy próbowałeś już uruchomić program InvokeLambda? Wydaje mi się to poprawne. –

+0

@JoeTaylor: Tak, próbowałem uruchomić zajęcia. Otrzymuję {"errorMessage": "Class not found: com.aws.HelloLambda", "errorType": "class java.lang.ClassNotFoundException"} error – Unknown

Odpowiedz

8

Biorąc pod uwagę informacje w komentarzu, kod klienta wywołujący funkcję jest w porządku. Problem wydaje się być związany z konfiguracją samej funkcji. W szczególności AWS Lambda nie może znaleźć wskazanego programu obsługi (com.aws.HelloLambda::handleRequest), ponieważ nie pasuje do nazwy i pakietu klasy obsługi (Hello) i nazwy metody w tej klasie (handleRequest).

Możesz zaktualizować nazwę funkcji w konsoli AWS. Wybierz swoją funkcję, następnie kartę konfiguracji, a następnie właściwość Handler.

Prawdopodobnie chcesz go zmienić z com.aws.HelloLambda::handleRequest na Hello::handleRequest.

example of how to update the Handler name in the console

Przed badaniem funkcji od swojego klienta Java, można go przetestować bezpośrednio za pomocą konsoli, to pomoże Ci upewnić się, że funkcja jest prawidłowo skonfigurowany.

1

Innym sposobem wywołania lambda z kodu java jest użycie LambdaInvokerFactory i znalazłem to podejście czystsze. trzeba wykonać następujące czynności:

  1. Zdefiniuj interfejs reprezentujący swoją funkcję i opisywanie sposobu z @LambdaFunction
  2. Tworzenie realizację powyższego interfejsu za pomocą LambdaInvokerFactory
  3. Wywołanie funkcji lambda używając właśnie utworzonego obiektu proxy (implementacja interfejsu)

    Bardziej szczegółowy przykład można znaleźć here.

+0

Powiedziałbym, że problem z tym podejściem polega na tym, że używa on gniazda i wejścia dane muszą być zgodne z oczekiwaniami Jacksona. Jeśli chcesz użyć własnego serializatora json, nie jest to możliwe. Jeśli twoje dane mają złożone typy danych, powiedziałbym, idź z InvokeRequest. – paramupk

+0

Tak, jeśli potrzebujesz więcej swobody, to InvokeRequest będzie twoim przyjacielem. – isaranchuk

Powiązane problemy