在python中从对AWS lambda的异步调用中获取响应结果

nad*_*nad 5 amazon-web-services aws-lambda

我有一个 AWS lambda 函数,我可以同步调用它并使用以下代码返回结果

response = lambda_client.invoke(
        FunctionName=FUNCTION_NAME,
        InvocationType='RequestResponse',
        LogType='Tail',
        Payload=payload,
        Qualifier=$LATEST
    )
Run Code Online (Sandbox Code Playgroud)

响应 Payload 的类型<botocore.response.StreamingBody object at 0x115fb3160>所以我使用下面的代码来提取工作正常的有效负载。

response_body = response['Payload']
response_str = response_body.read().decode('utf-8')
response_dict = eval(response_str)
Run Code Online (Sandbox Code Playgroud)

现在,我需要异步调用我的 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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?如果响应负载与同步调用的类型相同,为什么会出现解析错误?有什么建议吗?

编辑

为清楚起见,我明白如果InvocationType='Event', 那么我们只得到invoke调用的状态,而不是 lambda 函数的结果。不过,在我的情况下,我需要两者 - 启动 lambda 异步并在完成后返回结果。我怎么做?是否将结果写回 s3 并定期检查这是唯一的选择?

Mic*_*bot 7

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

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

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

请注意,这里提到的队列是 Lambda 服务内部的队列,不要与 Amazon Simple Queue Service (SQS) 混淆。

  • 此外,如果您确实需要异步 Lambda 执行的结果,则应考虑让 Lambda 函数将其结果写入 S3(或类似的东西)的已知位置,Lambda 函数的客户端可以在该位置定期检查是否存在结果。 (4认同)