从另一个Java Lambda调用AWS JAVA LAMBDA的问题

时间:2018-02-21 07:32:03

标签: java amazon-web-services lambda aws-lambda

我想从另一个lambda调用一个位于JAVA中的aws lambda。我查看以下结果 "https://stackoverflow.com/questions/36483042/how-to-call-an-aws-java-lambda-function-from-another-aws-java-lambda-function-wh"

我实现了如下代码。

首先,我创建一个AWS lambda java项目。我的代码如下所示

import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder;
import com.amazonaws.services.lambda.invoke.LambdaInvokerFactory;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<Object, String> {

    @Override
    public String handleRequest(Object input, Context context) {
        context.getLogger().log("Input: " + input);

        FineGrainedService fg = LambdaInvokerFactory.builder()
                .lambdaClient(
                        AWSLambdaAsyncClientBuilder.standard()

                        .build()
                )
                .build(FineGrainedService.class);

        context.getLogger().log("Response back from FG" + fg.getClass());

        String fgRespone = fg.callFineGrained("Call from Gateway");
        context.getLogger().log("fgRespone: " + fgRespone);

        // TODO: implement your handler
        return "Hello from Gateway Lambda!";
    }
}

根据上面的链接创建了一个界面

import com.amazonaws.services.lambda.invoke.LambdaFunction;

public interface FineGrainedService {
     @LambdaFunction(functionName="SimpleFineGrained")
     String callFineGrained(String input);
}

再次创建另一个lambda来调用上面的lambda

import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder;
import com.amazonaws.services.lambda.invoke.LambdaInvokerFactory;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler2 implements RequestHandler<Object, String> {

    @Override
    public String handleRequest(Object input, Context context) {
        context.getLogger().log("Input: " + input);

        FineGrainedService fg = LambdaInvokerFactory.builder()
                .lambdaClient(
                        AWSLambdaAsyncClientBuilder.standard().build()
                )
                .build(FineGrainedService.class);

        context.getLogger().log("Response back from FG" + fg.getClass());

        String fgRespone = fg.callFineGrained("Call from Gateway");
        context.getLogger().log("fgRespone: " + fgRespone);

        // TODO: implement your handler
        return "Hello from Gateway Lambda!";
    }
}

为pom.xml添加了maven依赖

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-lambda</artifactId>
 </dependency>

为我当前的角色添加了lambda调用权限。 然后我将代码上传到AWS。但是当我测试这个时,我会收到如下错误的信息..请问你能帮我搞清楚吗?

enter image description here

如果有人能帮助解决这个问题,或者使用JAVA从另一个lambda调用lambda的任何其他方式,我将不胜感激

3 个答案:

答案 0 :(得分:0)

我们永远不应该直接将lambda链接在一起,AWS步骤功能是正确的方法。您可以浏览AWS documentation。这是一个结构良好的文档,提供我的AWS,所以无需担心。

  

注意:当我们需要在异步工作时获取响应时,AWS步骤功能不好,所以我们需要在代码中一次又一次地轮询该函数,以了解它是处于运行状态还是处于完成状态的状态

因此它基于要求。当我们不必等待操作完成时,AWS步骤功能是最好的。您可以参考example1example2

答案 1 :(得分:0)

如果您确定需要超过5分钟,我的解决方案就是处理CSV文件。

1)转到S3 Bucket为lambda创建通知触发器。

2)通过使用lambda事件,您可以阅读有关s3对象元数据的信息,并使用批处理客户端在AWS Batch中提交作业。

3)您需要为lambda创建具有适当批处理权限的IAM角色。

AWS Batch只是一个运行应用程序或服务的dockerized环境。

AWS Batch要求您在AWS ECR存储库或Docker Cloud中创建docker文件和存储映像。您将批量添加现货实例。

答案 2 :(得分:0)

尝试使用AWS Step Functions调用Lambda函数。每个Step函数实际上都是Lambda函数,并且该lambda函数可以调用其他AWS服务。因此,您可以构建一个工作流,其中每个步骤都可以调用不同的服务。有关详细信息,请参阅此针对每个步骤使用Java V2的AWS教程:

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases/creating_workflows_stepfunctions