所以我正在使用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”,则一切正常,并且可以打印响应变量,但这是同步的。我错过了一些简单的事情吗?当异步调用返回时,我如何执行一些代码,例如打印结果?
谢谢。
异步执行的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。 对于Event调用类型,此状态代码将为202。对于DryRun调用类型,状态码将为204。 […] 响应返回以下内容作为HTTP正文。 有效载荷 它是Lambda函数返回的对象的JSON表示形式。 仅当调用类型为时才存在RequestResponse。
HTTP/1.1 StatusCode X-Amz-Function-Error: FunctionError X-Amz-Log-Result: LogResult Payload
如果操作成功,该服务将发回以下HTTP响应。
HTTP状态代码的成功范围将在200范围内。对于RequestResponse调用类型,此状态代码将为200。 对于Event调用类型,此状态代码将为202。对于DryRun调用类型,状态码将为204。
RequestResponse
Event
DryRun
[…]
响应返回以下内容作为HTTP正文。
它是Lambda函数返回的对象的JSON表示形式。 仅当调用类型为时才存在RequestResponse。