如何异步调用 AWS Lambda 函数

How to invoke an AWS Lambda function asynchronously

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

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

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

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

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

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

以下代码可用于从另一个 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);

接受的答案中给出的方法现已弃用。用户@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-

您可以尝试以下方法:

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);