问题描述
异步执行的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”,则一切正常,并且可以打印响应变量,但这是同步的。我错过了一些简单的事情吗?当异步调用返回时,我如何执行一些代码,例如打印结果?
谢谢。