【问题标题】:AWS boto3 invoke lambda returns None payloadAWS boto3 调用 lambda 返回无负载
【发布时间】:2021-07-06 21:28:20
【问题描述】:

我不太清楚为什么这段代码会失败,我很高兴听到你的想法。我使用了 boto3 中的示例及其一般工作,但在某些情况下我会突然得到一个 AttributeError 。请解释我做错了什么,因为如果有效负载为 None,我将收到 JSON 解码错误,但不是 None 对象。

这是导致异常的代码的简化版本。

import boto3
import json

client = boto3.client('lambda', region_name='...')
res = client.invoke(
    FunctionName='func',
    InvocationType='RequestResponse',
    Payload=json.dumps({'param': 123})
)
payload = json.loads(res["Payload"].read().decode('utf-8'))
for k in payload.keys():
    print(f'{k} = {payload[k]}')

错误

----
[ERROR] AttributeError: 'NoneType' object has no attribute 'keys'
Traceback (most recent call last):
.....

【问题讨论】:

  • 您是否在 lambda 结束时返回任何内容?当你在本地运行它时会返回什么?你能验证你的 lambda 正在运行吗?
  • @CoinGraham 应该会返回一些东西,但如果 StreamingBody 为空,会不会是 JSON 解码错误?只是想了解它是如何工作的。
  • 不确定。在你 json.load 之前它实际上返回了什么?
  • @CoinGraham 老实说,我不知道到目前为止我只得到过一次并且无法复制。由于某种原因,有效负载为 None 并且 json.loads 不会引发任何错误。它让我失望,我没有任何期望。任何想法为什么会发生这种情况?

标签: python amazon-web-services aws-lambda boto3


【解决方案1】:

刚刚在我的环境中复制了您的问题,方法是创建一个不返回任何内容的 lambda 并使用 boto3 调用它。 “null”对象通过 json 加载没有错误,但没有任何键,因为它不是字典。

def lambda_handler(event, context):
    pass

我创建的代码和你的一样,但遇到了同样的错误。奇怪的是,我可以通过尝试用这一行打印出流式主体来得到 json 错误

print(res["Payload"].read().decode('utf-8'))

在加载之前。我不知道为什么会这样。

编辑:看起来一旦你从 StreamingBody 对象中读取,它就是空的。 https://botocore.amazonaws.com/v1/documentation/api/latest/reference/response.html#botocore.response.StreamingBody。我的建议是从流式主体中读取数据并检查“null”并正常处理。

【讨论】:

  • 让我直说吧。您也遇到了姿态错误,但在尝试打印出来后,您遇到了解码错误。这样对吗?任何想法为什么会这样?
  • 是的。如果我将您的代码用于不返回任何内容的 lambda,我会得到确切的属性错误。所以我认为这就是答案。修复 lambda 返回,您将停止收到属性错误。我认为,一旦您从流式主体中读取内容,它就会以某种方式对其进行更改。这是我对为什么它在一种情况下而不是另一种情况下失败的最佳猜测。无论如何,您可以在代码中添加对“null”的检查。我想我可能会提出关于 boto3 的问题。
  • 刚刚验证了初始流式主体具有原始数据 b'null',但在读取它之后,流式传输主体中的原始数据只是 b''。这就解释了为什么第一个成功而第二个没有。我会提出一个问题,看看我是否能弄清楚这是否符合预期。
  • 已验证 botocore.amazonaws.com/v1/documentation/api/latest/reference/… 它按预期工作。一旦你从 StreamingBody 对象中读取,它就是空的。
  • 我可以确认,这是 lambda 中缺少的 return 语句。感谢您的提示!
猜你喜欢
  • 2021-06-17
  • 1970-01-01
  • 2018-08-21
  • 2019-12-05
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多