如何异步调用AWS Lambda函数

时间:2016-05-21 15:47:52

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

关于在不使用SDK的情况下异步调用Lambda函数的第二个问题,我将研究使用API Gateway as a service proxy。这是为异步调用公开Lambda函数的推荐方法。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以尝试以下操作:

msg_receive_1 = WebDriverWait(driver1, 15).until(
    EC.visibility_of_element_located((By.XPATH, "//*[text()='Hello, my name is Jeff.']"))
)