简体   繁体   English

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

[英]Issue on Calling AWS JAVA LAMBDA From Another Java Lambda

I want to call a aws lambda which is in JAVA from another lambda.我想从另一个 lambda 调用 JAVA 中的 aws lambda。 I go through the below result "https://stackoverflow.com/questions/36483042/how-to-call-an-aws-java-lambda-function-from-another-aws-java-lambda-function-wh"我浏览了以下结果“https://stackoverflow.com/questions/36483042/how-to-call-an-aws-java-lambda-function-from-another-aws-java-lambda-function-wh”

I implemented the code like below.我实现了如下代码。

First I create one AWS lambda java project.首先,我创建了一个 AWS lambda java 项目。 My code is like below我的代码如下

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

As per the above link created one interface根据上面的链接创建了一个界面

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

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

Again created another lambda to call the above lambda再次创建了另一个 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!";
    }
}

Added maven dependency to pom.xml向 pom.xml 添加了 maven 依赖

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

Added lambda invoke permission to my current role.为我当前的角色添加了 lambda 调用权限。 Then I uploaded the code to the AWS.然后我将代码上传到 AWS。 But when I am testing this I am getting an error like below.. Please could you help me to figure out this?但是当我测试这个时,我收到如下错误..请你帮我弄清楚这个吗?

在此处输入图片说明

It would be grateful if anyone can help to get this... Or any other way to call a lambda from another lambda using JAVA如果有人可以帮助解决这个问题,将不胜感激......或者使用JAVA从另一个lambda调用lambda的任何其他方式

We should never directly link lambda together, AWS step function is the right way to go.我们永远不应该将 lambda 直接链接在一起,AWS step function 是正确的方法。 You can go through the AWS documentation .您可以阅读AWS 文档 It is a well-structured documentation provide my AWS so no need to worry.它是一个结构良好的文档,为我的 AWS 提供了帮助,因此无需担心。

Note: AWS step function is not good when we need to get the response back as it works asynchronously so we need to poll the function again and again in the code to know the status whether it is in running or in a finished state.注意:当我们需要获取响应时,AWS step 函数不好用,因为它是异步工​​作的,因此我们需要在代码中一次又一次地轮询该函数以了解它是处于运行状态还是已完成状态。

So it is based on the requirement.所以它是基于需求的。 AWS step function is best when we don't have to wait for the operation to finish.当我们不必等待操作完成时,AWS step 函数是最好的。 You can refer to example1 and example2可以参考example1example2

When you are sure it takes more than 5 minutes following is my solution to process the CSV File.当您确定需要 5 分钟以上时,以下是我处理 CSV 文件的解决方案。

1) Goto S3 Bucket Create Notification trigger for lambda. 1) 转到 lambda 的 S3 存储桶创建通知触发器。

2) By using the lambda event you can read about s3 object metadata and submit a Job in AWS Batch using batch client. 2) 通过使用 lambda 事件,您可以阅读有关 s3 对象元数据的信息,并使用批处理客户端在 AWS Batch 中提交作业。

3) You need to create an IAM role for lambda with proper batch permissions. 3) 您需要为 lambda 创建一个具有适当批处理权限的 IAM 角色。

AWS Batch is nothing but a dockerized environment to run the application or service. AWS Batch 只不过是一个运行应用程序或服务的 dockerized 环境。

AWS Batch requires you to create docker file and store image in AWS ECR repository or Docker Cloud. AWS Batch 要求您创建 docker 文件并将图像存储在 AWS ECR 存储库或 Docker Cloud 中。 You will add spot instances in batch.您将批量添加 Spot 实例。

Try using AWS Step Functions to invoke Lambda functions.尝试使用 AWS Step Functions 调用 Lambda 函数。 Each Step function is actually a Lambda function and that lambda function can invoke other AWS Services.每个 Step 函数实际上是一个 Lambda 函数,并且该 lambda 函数可以调用其他 AWS 服务。 Therefore you can build a workflow where each step can invoke different services.因此,您可以构建一个工作流,其中每个步骤都可以调用不同的服务。 For details, see this AWS tutorial that uses Java V2 for each step:有关详细信息,请参阅此 AWS 教程,其中每个步骤都使用 Java V2:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM