AWS Lambda:如何从简单的 java class 调用 lambda 函数
AWS Lambda : How to call lambda function from simple java class
我创建了简单的 Lambda 函数,upload 将其发送到 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 class 从其他项目调用此 Lambda 函数。我正在使用 aws-java-sdk-lambda-1.10.22
来调用函数。但是我没能成功。
这是我的 InvokeLambda class,它是一个单独的项目。
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
),因为它与您的处理程序 class (Hello
) 的名称和包以及名称不匹配你的方法在那 class (handleRequest
).
您可以通过 AWS 控制台更新函数处理程序名称。选择您的功能,然后选择配置选项卡,然后选择处理程序 属性。
您可能希望将其从 com.aws.HelloLambda::handleRequest
更改为 Hello::handleRequest
。
在从您的 Java 客户端测试该功能之前,您可以直接通过控制台对其进行测试,这将帮助您确保该功能配置正确。
从 java 代码调用 lambda 的另一种方法是使用 LambdaInvokerFactory
,我发现这种方法更简洁。
您需要执行以下操作:
用@LambdaFunction
定义代表你的函数的接口和注释方法
使用LambdaInvokerFactory
创建上述接口的实现
使用刚创建的代理对象调用lambda函数(接口实现)
可以找到更详细的例子here。
我创建了简单的 Lambda 函数,upload 将其发送到 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 class 从其他项目调用此 Lambda 函数。我正在使用 aws-java-sdk-lambda-1.10.22
来调用函数。但是我没能成功。
这是我的 InvokeLambda class,它是一个单独的项目。
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
),因为它与您的处理程序 class (Hello
) 的名称和包以及名称不匹配你的方法在那 class (handleRequest
).
您可以通过 AWS 控制台更新函数处理程序名称。选择您的功能,然后选择配置选项卡,然后选择处理程序 属性。
您可能希望将其从 com.aws.HelloLambda::handleRequest
更改为 Hello::handleRequest
。
在从您的 Java 客户端测试该功能之前,您可以直接通过控制台对其进行测试,这将帮助您确保该功能配置正确。
从 java 代码调用 lambda 的另一种方法是使用 LambdaInvokerFactory
,我发现这种方法更简洁。
您需要执行以下操作:
用
定义代表你的函数的接口和注释方法@LambdaFunction
使用
创建上述接口的实现LambdaInvokerFactory
使用刚创建的代理对象调用lambda函数(接口实现)
可以找到更详细的例子here。