我是AWS lambda的新手我已经用处理程序
创建了一个lambda函数example.Orders::orderHandler
这是自定义处理程序,现在我想从我的Java程序中调用它,我该怎么做呢。
答案 0 :(得分:6)
本课程中的2种方法应该能够为您提供帮助。一个用于是否需要传入有效载荷,另一个用于有效载荷为空。
但是,您需要记住一件事:函数名称可能与处理程序不同(后者是example.Orders::orderHandler
)。调用其函数时,处理程序名称为不。
所以,如果你有一个带有函数名称'myFunction'的函数,在幕后调用你的example.Orders::orderHandler
处理程序,那么这就是你想要的传递给下面的运行方法。
import com.amazonaws.regions.Regions;
import com.amazonaws.services.lambda.AWSLambdaAsyncClient;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;
class LambdaInvoker {
public void runWithoutPayload(String region, String functionName) {
runWithPayload(region, functionName, null);
}
public void runWithPayload(String region, String functionName, String payload) {
AWSLambdaAsyncClient client = new AWSLambdaAsyncClient();
client.withRegion(Regions.fromName(region));
InvokeRequest request = new InvokeRequest();
request.withFunctionName(functionName).withPayload(payload);
InvokeResult invoke = client.invoke(request);
System.out.println("Result invoking " + functionName + ": " + invoke);
}
}
答案 1 :(得分:2)
我按照以下代码打印了Lambda的响应
AWSLambdaAsyncClient lambdaClient = new AWSLambdaAsyncClient();
lambdaClient.withRegion(Region.getRegion(Regions.US_WEST_2));
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.setInvocationType("RequestResponse"); // ENUM RequestResponse or Event
invokeRequest.withFunctionName("FUNCTION NAME").withPayload(payload);
InvokeResult invoke = lambdaClient.invoke(invokeRequest);
try {
// PRINT THE RESPONSE
String val = new String(invoke.getPayload().array(), "UTF-8");
System.out.println("Response==> " + val);
} catch (Exception e) {
System.out.println("error");
}
答案 2 :(得分:2)
使用以下 LATEST 代码同步调用Lambda函数:
final String AWS_ACCESS_KEY_ID = "xx";
final String AWS_SECRET_ACCESS_KEY = "xx";
AWSCredentials credentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY);
// ARN
String functionName = "XXXX";
//This will convert object to JSON String
String inputJSON = new Gson().toJson(userActivity);
InvokeRequest lmbRequest = new InvokeRequest()
.withFunctionName(functionName)
.withPayload(inputJSON);
lmbRequest.setInvocationType(InvocationType.RequestResponse);
AWSLambda lambda = AWSLambdaClientBuilder.standard()
.withRegion(Regions.US_EAST_1)
.withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
InvokeResult lmbResult = lambda.invoke(lmbRequest);
String resultJSON = new String(lmbResult.getPayload().array(), Charset.forName("UTF-8"));
System.out.println(resultJSON);
使用这些依赖项来避免任何错误:
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.6.1</version>
</dependency>
//Required by BeanstalkDeploy.groovy at runtime
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-lambda</artifactId>
<version>1.11.207</version>
</dependency>
答案 3 :(得分:1)
在部署Lambda函数时定义处理程序。只有AWS Lambda服务需要知道您的自定义处理程序是什么。因此,处理程序与调用该函数的Java代码无关。调用Lambda函数的任何事情只需要知道Lambda函数名称,而不是处理程序名称。
在Java中,您可以通过here记录的{{1}}方法调用Lambda函数。
答案 4 :(得分:0)
作为旁注,在Eclipse中创建AWS Lambda Java项目时,还必须添加
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-lambda</artifactId>
<version>1.11.411</version>
</dependency>
到pom.xml,否则这些导入将失败:
import com.amazonaws.services.lambda.AWSLambdaAsyncClient;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;