【发布时间】:2020-01-30 05:38:11
【问题描述】:
我有一个 AWS lambda 函数,我可以通过以下代码同步调用并返回结果
response = lambda_client.invoke(
FunctionName=FUNCTION_NAME,
InvocationType='RequestResponse',
LogType='Tail',
Payload=payload,
Qualifier=$LATEST
)
响应负载的类型为<botocore.response.StreamingBody object at 0x115fb3160>,所以我使用下面的代码来提取可以正常工作的负载。
response_body = response['Payload']
response_str = response_body.read().decode('utf-8')
response_dict = eval(response_str)
现在,我需要异步调用我的 lambda,所以我将调用类型更改为 InvocationType='Event'
它给了我一个与以前相同类型的有效负载的响应,botocore.response.StreamingBody object,但我在这行出现错误 - response_dict = eval(response_str)
错误信息说
response_dict = eval(response_str)
File "<string>", line 0
^
SyntaxError: unexpected EOF while parsing
我错过了什么?如果响应负载与同步调用的类型相同,为什么会出现此解析错误?有什么建议吗?
编辑
为了清楚起见,我理解如果InvocationType='Event',那么我们只能得到invoke 调用的状态,而不是lambda 函数结果。但在我的情况下,我需要两者 - 启动 lambda 异步并在完成后返回结果。我怎么做?是否将结果写回 s3 并定期检查唯一的选项?
【问题讨论】:
-
我已经回答了为什么这不能像你预期的那样工作,但我无法预料的是你实际上试图通过异步调用来完成什么,因为你仍然想要结果返回。请告知,如果还有问题,也许我或其他人可以帮助您解决最初的问题。
-
@Michael-sqlbot 请看编辑
-
在 Lambda 中没有架构化的方式来做你想做的事。你需要设计一个解决方案。一种选择是客户端调用初始 Lambda 以发送 UUID 及其请求,然后异步 Lambda 执行其工作并将结果写入某处(例如,DynamoDB 或 S3,使用客户端提供的 UUID 作为键) ,然后客户端可以轮询传递相同 UUID 的第二个 Lambda,以便在结果可用时检索结果。或者原始 Lambda 通过 SNS 发送通知,您的客户端轮询 SNS。
标签: amazon-web-services aws-lambda