2016-01-11 26 views
10

Basit Lambda işlevi ve upload bunu AWS Lambda için oluşturdum.AWS Lambda: Basit java sınıfından lambda işlevi nasıl çağırılır

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

} 

} 

Bu Lambda işlevini başka bir projeden java sınıfını kullanarak çağırmak istiyorum. Fonksiyonu çağırmak için aws-java-sdk-lambda-1.10.22 kullanıyorum. Ama bunu başaramıyorum.

İşte ayrı bir proje olan InvokeLambda sınıfım.

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

Java kullanarak lambda işlevi nasıl aranır?

+0

Tam olarak ne sorun yaşıyorsunuz? InvokeLambda programını çalıştırmayı denediniz mi? Bana doğru görünüyor. –

+0

@JoeTaylor: Evet, sınıfı çalıştırmayı denedim. {"ErrorMessage" alıyorum: "Sınıf bulunamadı: com.aws.HelloLambda", "errorType": "sınıf java.lang.ClassNotFoundException"} Hata – Unknown

cevap

8

Yorumunuzdaki bilgiler verildiğinde, istemci kodunuzun işlevi çağırması iyi olur. Sorun, fonksiyonun kendisinin konfigürasyonu ile ortaya çıkmaktadır. Özellikle, AWS Lambda belirttiğiniz işleyiciyi bulamıyor (com.aws.HelloLambda::handleRequest) çünkü bu, işleyici sınıfınızın adı ve paketiyle eşleşmiyor (Hello) ve yönteminizin o sınıftaki adı (handleRequest).

İşlev işleyici adını AWS Konsolu'ndan güncelleyebilirsiniz. İşlevinizi, ardından yapılandırma sekmesini ve ardından İşleyici özelliğini seçin.

Muhtemelen com.aws.HelloLambda::handleRequest'dan Hello::handleRequest'a değiştirmek isteyebilirsiniz.

example of how to update the Handler name in the console

Java istemciden işlevini test etmeden önce konsol üzerinden doğrudan test edebilir, bu işlev doğru yapılandırılmış sağlamaya yardımcı olur.

1

Java kodundan lambda çağırmanın başka bir yolu da LambdaInvokerFactory kullanmaktır ve bu yaklaşımı daha temiz buldum. işlevinizi temsil arayüzünü tanımlar ve LambdaInvokerFactory

  • Çağırma lambda fonksiyonu yeni oluşturulan vekil nesnesini kullanarak (arayüz uygulamasını kullanarak yukarıdaki arayüzünün uygulanmasını oluşturun @LambdaFunction

  • ile yöntemini açıklama

    1. : aşağıdakileri yapmak gerekir

      Daha ayrıntılı bir örnek here bulunabilir.

  • +0

    Bu yaklaşımla sorunu söyleyebilirim jackon ve giriş kullanır Verilerin Jackson'un istediği şekilde ilerlemesi gerekiyor. Kendi json serializer'ınızı kullanmak istiyorsanız, bu mümkün değildir. Verileriniz karmaşık veri türlerine sahipse, o zaman InvokeRequest ile giderim. – paramupk

    +0

    Evet, daha fazla özgürlüğe ihtiyacınız varsa, InvokeRequest arkadaşınız olacak. – isaranchuk