【问题标题】:How to invoke an AWS Lambda function asynchronously如何异步调用 AWS Lambda 函数
【发布时间】:2016-09-18 19:12:34
【问题描述】:

有谁知道以异步方式而不是同步方式调用 Amazon AWS Lambda 函数的当前正确方法?

AWS Java SDK 中的 InvokeAsync API 仍然可用,但标记为已弃用,他们建议您使用 Invoke API。我不明白为什么他们会强迫我们使用同步。我有一个分派一些批处理作业的 Web 前端。我不能指望前端在等待响应时保持连接打开几分钟(实际上是在大约 4-5 分钟的处理后通过电子邮件发送给他们)。

理想情况下,我试图弄清楚如何使用他们的 API 端点而不是 Java SDK 来做到这一点,因为我运行后端的环境 (GAE) 不支持 AWS 对 HttpClient 的使用。

【问题讨论】:

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


    【解决方案1】:

    我正在查看最新的 API 文档 here,看起来只有 AWSLambdaAsyncClient.invokeAsyncAsync() 已被弃用。 AWSLambdaAsyncClient.invokeAsync() 方法未标记为已弃用。看起来他们只是通过消除对 InvokeAsyncRequestInvokeAsyncResult 类以及额外的 invokeAsyncAsync() 方法的需要来进行一些代码清理。

    您应该能够使用AWSLambdaAsyncClient.invokeAsync() 方法,该方法使用InvokeRequest 并返回InvokeResult。您可能必须将InvokeRequest 上的InvocationType 设置为InvocationType.Event。如果您使用的是 Async 客户端,则不清楚是否需要这样做。

    关于您关于不使用 SDK 异步调用 Lambda 函数的第二个问题,我会考虑使用 API Gateway as a service proxy。这是为异步调用公开 Lambda 函数的推荐方式。

    【讨论】:

    • 谢谢你,这帮助我澄清了事情!
    【解决方案2】:

    以下代码可用于从另一个 Lambda 异步调用 Lambda

    AWSLambdaAsyncClient client = new AWSLambdaAsyncClient();
    client.withRegion(Regions.fromName(region));
    InvokeRequest request = new InvokeRequest();
    request.setInvocationType("Event");
    request.withFunctionName(functionName).withPayload(payload);
    InvokeResult invoke = client.invoke(request);
    

    【讨论】:

    • 以上例子是针对JAVA中的Lambda
    • 如何定义payload,如果我想添加JsonObject那么!!
    • ObjectMapper 可用于将自定义 Object 转换为 JSON,然后可以作为有效负载传递
    • 我想强调这里的神奇之处在于将 invocationType 设置为 Event。如果没有该行,父 lambda 将等待子函数终止。
    【解决方案3】:

    现在已弃用已接受答案中给出的方法。用户@dassum给出的答案是要遵循的方法,但答案缺乏一点解释。

    创建 InvokeRequest 时,将 InvocationType 设置为“Event”以进行异步调用,将“RequestResponse”设置为同步调用。

    AWSLambda lambda = //create your lambda client here
    lambda.invoke(new InvokeRequest()
                                .withFunctionName(LAMBDA_FUNCTION_NAME)
                                .withInvocationType(InvocationType.Event) //asynchronous
                                .withPayload(payload))
    

    参考文档:

    https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/lambda/AWSLambda.html#invoke-com.amazonaws.services.lambda.model.InvokeRequest-

    【讨论】:

      【解决方案4】:

      您可以尝试以下方法:

      YourCustomRequestBean request = new YourCustomRequestBean();
      
      request.setData1(data1);
      request.setData2(data2);
      request.setData3(data3);
      
      ClientConfiguration clientConfiguration = new ClientConfiguration();
      clientConfiguration.setSocketTimeout(xxxx);
      clientConfiguration.setRequestTimeout(xxxx);
      
      ObjectMapper objectMapper = new ObjectMapper();
      String jsonStr = objectMapper.writeValueAsString(request);
      AWSLambdaAsync awsLambdaAsync = 
      AWSLambdaAsyncClientBuilder.standard().withRegion(<mention your region here>).withClientConfiguration(clientConfiguration).build();
      
      InvokeRequest invokeRequest = new InvokeRequest()
          .withFunctionName(lambda function urn)
          .withPayload(jsonStr);
      awsLambdaAsync.invokeAsync(invokeRequest);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 2021-06-04
        • 2020-01-31
        • 2019-11-11
        • 1970-01-01
        • 2019-10-27
        • 2016-10-30
        相关资源
        最近更新 更多