簡體   English   中英

AWS Lambda:如何從簡單的java類調用lambda函數

[英]AWS Lambda : How to call lambda function from simple java class

我創建了簡單的Lambda函數並將其上傳到AWS Lambda。

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

}

}

我想使用java類從其他項目調用此Lambda函數。 我正在使用aws-java-sdk-lambda-1.10.22來調用該函數。 但我無法成功。

這是我的InvokeLambda類,它是一個單獨的項目。

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調用lambda函數?

根據您的評論中的信息,您調用該函數的客戶端代碼很好。 問題似乎與功能本身的配置有關。 具體來說,AWS Lambda無法找到您指定的處理程序( com.aws.HelloLambda::handleRequest ),因為它與您的處理程序類( Hello )的名稱和包以及您的方法名稱不匹配class( handleRequest )。

您可以通過AWS控制台更新功能處理程序名稱。 選擇您的函數,然后選擇配置選項卡,然后選擇Handler屬性。

您可能希望將其從com.aws.HelloLambda::handleRequest更改為Hello::handleRequest

如何在控制台中更新Handler名稱的示例

在從Java客戶端測試函數之前,您可以直接通過控制台對其進行測試,這將有助於確保正確配置該函數。

從java代碼調用lambda的另一種方法是使用LambdaInvokerFactory ,我發現這種方法更清晰。 您需要執行以下操作:

  1. 使用@LambdaFunction定義表示函數的接口和注釋方法
  2. 使用LambdaInvokerFactory創建上述接口的LambdaInvokerFactory
  3. 使用剛創建的代理對象調用lambda函數(接口實現)

    更詳細的例子可以在這里找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM