使用boto调用lambda函数如何异步执行此操作?

问题描述

异步执行的AWS Lambda函数不会返回执行结果。如果异步调用请求成功(即,没有由于权限等导致的错误),AWS Lambda将立即返回HTTP状态代码202 ACCEPTED,并且不承担与传递有关此异步调用结果的任何信息的进一步责任。

AWS Lambda Invoke操作的文档中:

响应语法

HTTP/1.1 StatusCode
X-Amz-Function-Error: FunctionError
X-Amz-Log-Result: LogResult

Payload

响应元素

如果操作成功,该服务将发回以下HTTP响应。

状态码

HTTP状态代码的成功范围将在200范围内。对于RequestResponse调用类型,此状态代码将为200。。对于DryRun调用类型,状态码将为204。

[…]

响应返回以下内容作为HTTP正文。

有效载荷

它是Lambda函数返回的对象的JSON表示形式。

解决方法

所以我正在使用boto调用我的lambda函数并测试我的后端。我想异步调用它们。我注意到“
invoke_async”已被弃用,不应使用。相反,您应该将InvocationType与“
Event”的InvocationType一起使用以异步执行该功能。

但是,我似乎无法弄清楚如何从函数中获取响应。我尝试了以下方法:

payload3=b"""{
"latitude": 39.5732160891,"longitude": -119.672918997,"radius": 100
}"""

client = boto3.client('lambda')
for x in range (0,5):
    response = client.invoke(
        FunctionName="loadSpotsAroundPoint",InvocationType='Event',Payload=payload3
    )
    time.sleep(15)
    print(json.loads(response['Payload'].read()))
    print("\n")

即使我告诉代码休眠15秒钟,当我尝试打印它时,响应变量仍然为空。如果我将Invokation InvokationType更改为“
RequestResponse”,则一切正常,并且可以打印响应变量,但这是同步的。我错过了一些简单的事情吗?当异步调用返回时,我如何执行一些代码,例如打印结果?

谢谢。