2016-01-11 21 views
10

Tôi đã tạo hàm Lambda đơn giản và upload điều này thành AWS Lambda.AWS Lambda: Cách gọi hàm lambda từ lớp java đơn giản

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

} 

} 

Tôi muốn gọi hàm Lambda này từ một số dự án khác sử dụng lớp java. Tôi đang sử dụng aws-java-sdk-lambda-1.10.22 để gọi hàm. Nhưng tôi không thể thành công trong đó.

Đây là lớp InvokeLambda của tôi là một dự án riêng biệt.

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

Cách gọi hàm lambda bằng java?

+0

Bạn đang gặp phải vấn đề gì? Bạn đã thử chạy chương trình InvokeLambda chưa? Nó có vẻ đúng với tôi. –

+0

@JoeTaylor: Vâng, tôi đã cố gắng để chạy lớp. Tôi nhận được {"errorMessage": "Không tìm thấy lớp: com.aws.HelloLambda", "errorType": "lỗi class java.lang.ClassNotFoundException"} – Unknown

Trả lời

8

Với thông tin trong nhận xét của bạn, mã khách hàng của bạn để gọi hàm là tốt. Vấn đề dường như là với cấu hình của chính hàm đó. Cụ thể, AWS Lambda không thể tìm trình xử lý bạn đã chỉ định (com.aws.HelloLambda::handleRequest) bởi vì nó không khớp với tên và gói của lớp trình xử lý của bạn (Hello) và tên của phương thức của bạn trong lớp đó (handleRequest).

Bạn có thể cập nhật tên trình xử lý chức năng thông qua Bảng điều khiển AWS. Chọn chức năng của bạn, sau đó là tab cấu hình và sau đó là thuộc tính Trình xử lý.

Bạn có thể muốn thay đổi từ com.aws.HelloLambda::handleRequest thành Hello::handleRequest.

example of how to update the Handler name in the console

Trước khi thử nghiệm chức năng từ khách hàng Java của bạn, bạn có thể kiểm tra nó trực tiếp thông qua giao diện điều khiển, điều này sẽ giúp bạn đảm bảo các chức năng được cấu hình đúng.

1

Một cách khác để gọi lambda từ mã java là sử dụng LambdaInvokerFactory và tôi thấy cách tiếp cận này rõ ràng hơn. Bạn cần phải làm như sau:

  1. Xác định giao diện đại diện cho chức năng của bạn và chú thích phương pháp với @LambdaFunction
  2. Tạo thực hiện của giao diện trên sử dụng LambdaInvokerFactory
  3. Gọi chức năng lambda sử dụng proxy object vừa tạo (thực hiện giao diện)

    Ví dụ chi tiết hơn có thể được tìm thấy here.

+0

Tôi sẽ nói vấn đề với phương pháp này là nó sử dụng jackon và đầu vào của bạn dữ liệu cần phải làm theo cách họ muốn. Nếu bạn muốn sử dụng serializer json của riêng bạn thì không thể. Nếu dữ liệu của bạn có kiểu dữ liệu phức tạp thì tôi sẽ nói với InvokeRequest. – paramupk

+0

Vâng, nếu bạn cần tự do hơn thì InvokeRequest sẽ là bạn của bạn. – isaranchuk

Các vấn đề liên quan