【问题标题】:Getting the response results from an asynchronous call to AWS lambda in python从python中对AWS lambda的异步调用获取响应结果
【发布时间】: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


【解决方案1】:

InvocationType='Event' 表示您没有收到回复。异步 Lambda 调用意味着您只想调用函数,而不是等待响应。来自函数的响应负载被服务丢弃。

当您异步调用函数时,Lambda 会将事件发送到队列。一个单独的进程从队列中读取事件并运行您的函数。 当事件被添加到队列中时,Lambda 会返回一个成功响应,而不需要额外的信息。 (强调)

https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html

注意这里提到的queue是Lambda服务里面的一个队列,不要和Amazon Simple Queue Service (SQS)混淆。

【讨论】:

  • 此外,如果您确实需要异步 Lambda 执行的结果,您应该考虑让 Lambda 函数将其结果写入 S3(或类似的东西),位于Lambda 函数可以定期检查结果是否存在。
  • @MatthewPope 似乎每次调用worker lambda都需要一个单独的s3对象,对吧?理想情况下,我可以在一个 single s3 文件中跟踪所有异步调用的状态,但我很难了解它们如何能够在不覆盖彼此结果的情况下访问同一个文件。有什么想法吗?
  • @MaileCupo,我的观点是,如果您需要异步调用的结果,您可以将结果写入某个已知位置,请求者可以在那里查找它们。对于如何实现用例,我没有任何特别的建议。您应该考虑为此提出一个关于 SO 的新问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 2017-04-27
  • 2016-12-31
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多