【问题标题】:Issue on Calling AWS JAVA LAMBDA From Another Java Lambda从另一个 Java Lambda 调用 AWS JAVA LAMBDA 的问题
【发布时间】:2018-02-21 07:32:02
【问题描述】:

我想从另一个 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。但是,当我对此进行测试时,出现如下错误。请您帮我解决这个问题吗?

如果有人能帮助获得这个将不胜感激...或任何其他方式使用 JAVA 从另一个 lambda 调用 lambda

【问题讨论】:

  • 我不确定您的确切要求。但 AWS Step 函数是实施该解决方案的最佳方式。其他方式是我们可以将数据从 lambda 发送到 SNS 并触发另一个 lambda。
  • @Mohan Shanmugam。感谢您的重播。您能解释一下如何对这个 lambda 使用阶跃函数吗?我试图得到这个。但我无法使用 step 功能实现这一点,因为我是 aws 的新手。你能帮忙实现这一点吗?
  • 我的确切要求是使用无服务器架构处理大型 csv。我得到了一个使用 stepfunction 处理大型 CSV 的链接。它在 node.js 中。我无法将事物转换为 java。我怎么能做到这一点?点击这里处理大csvlink请帮帮我
  • 你的大 csv 文件在哪里?你在S3吗?确认本地完成CSV文件处理需要多少时间?
  • 是的..我将我的 csv 保存在 s3 中。我正在为我的第一个 lambda 添加一个触发器。当然,我会在我的本地 java 广告中处理,让您知道完成 CSV 处理所用的图块。

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


【解决方案1】:

我们不应该直接将 lambda 链接在一起,AWS step function 是正确的方法。您可以通过AWS documentation。这是一个结构良好的文档,提供了我的 AWS,因此无需担心。

注意:AWS step 函数在我们需要返回响应时并不好,因为它是异步工​​作的,因此我们需要在代码中一次又一次地轮询该函数以了解它是处于运行状态还是处于完成状态.

所以它是基于要求。当我们不必等待操作完成时,AWS 步进函数是最好的。可以参考example1example2

【讨论】:

  • 嗨@Akhil Vijayan。感谢您的回复。我已经浏览了你提到的例子。但是你知道我有点困惑如何测试吗?如果我要去我的 Eclipse 并创建一个新的 aws lambda 项目,它将有一个处理程序。我如何将它用于我的项目?如果您不介意,请帮助我将其与我的处理程序集成。
  • 您在哪里需要帮助?您在测试 lambda 函数或 AWS step 函数时需要帮助吗?
  • 使用 Java V2 API 中内置的 Waiters,有许多操作不再需要轮询。见docs.aws.amazon.com/sdk-for-java/latest/developer-guide/…
【解决方案2】:

当您确定需要 5 分钟以上时,以下是我处理 CSV 文件的解决方案。

1) 转到 S3 存储桶为 lambda 创建通知触发器。

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

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

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

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

【讨论】:

  • 我希望它会成为一个服务器应用程序。我想将任务实现为无服务器应用程序
  • 当你在寻找无服务器时,你需要用 Java 编写你的 lambda 并按照你从 LinkedIn 引用的步骤函数链接。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2020-11-10
    • 1970-01-01
    • 2021-11-04
    • 2018-08-21
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多