如何从Java代码调用AWS lambda函数/处理程序

时间:2017-01-12 15:21:10

标签: java aws-lambda aws-sdk

我是AWS lambda的新手我已经用处理程序

创建了一个lambda函数
example.Orders::orderHandler

这是自定义处理程序,现在我想从我的Java程序中调用它,我该怎么做呢。

5 个答案:

答案 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;