AWS Lambda 函数 - 无法调用更新事物影子

Posted

技术标签:

【中文标题】AWS Lambda 函数 - 无法调用更新事物影子【英文标题】:AWS Lambda function - can't call update thing shadow 【发布时间】:2016-07-02 17:45:00 【问题描述】:

根据此处的 boto3 文档:https://boto3.readthedocs.org/en/latest/reference/services/iot-data.html#client update_thing_shadow 方法将 thingName 和 JSON 有效负载作为参数。目前是这样写的:

    client = boto3.client('iot-data', region_name='us-east-1')
    data = "state" :  "desired" :  "switch" : "on" 
    mypayload = json.dumps(data)
    response = client.update_thing_shadow(
        thingName = 'MyDevice', 
        payload = b'mypayload'
    )

当我使用命令行时没有问题,但似乎无法从 lamba 函数中正确获取它。我已经用许多版本的代码(json.JSONEncoder、bytearray() 等)调用了它,但没有任何运气。调用 UpdateThingShadow 操作时出现的错误范围从语法到 (ForbiddenException):错误请求:ClientError。有没有人从 AWS lambda 函数中成功调用此方法或类似方法?谢谢。

【问题讨论】:

payload = b'mypayload' 究竟应该在这里做什么? 用所需状态更新“MyDevice”,在这种情况下,将开关设置为“打开”位置 但这只是一个包含"mypayload" 的字符串常量。这不是您存储在名为mypayload 的变量中的实际有效负载。这就是我感到困惑的原因。 为了澄清,请参见上面的初始帖子“我已经用许多版本的代码调用它......没有任何运气。”由于之前的所有尝试都失败了,因此当前的内容是最新的。 好吧,您上面显示的示例似乎不正确。如上所述,您应该传递 JSON 有效负载,但传递的是字符串常量 "mypayload"。我建议解决该问题,然后使用新代码和您从服务中获得的确切响应更新问题。 【参考方案1】:

这段代码对我来说很好用:

def set_thing_state(thingName, state):
    # Change topic, qos and payload
    payload = json.dumps('state':  'desired':  'property': state  )

    logger.info("IOT update, thingName:"+thingName+", payload:"+payload)
    #payload = 'state':  'desired':  'property': state  


    response = client.update_thing_shadow(
        thingName = thingName, 
        payload =  payload
        )

    logger.info("IOT response: " + str(response))  
    logger.info("Body:"+response['payload'].read())


def get_thing_state(thingName):

    response = client.get_thing_shadow(thingName=thingName)

    streamingBody = response["payload"]
    jsonState = json.loads(streamingBody.read())

    print jsonState
    #print jsonState["state"]["reported"]

祝你好运

【讨论】:

【参考方案2】:

garnaat 是对的。 只需将payload = b'mypayload' 替换为payload = mypayload 即可。

【讨论】:

以上是关于AWS Lambda 函数 - 无法调用更新事物影子的主要内容,如果未能解决你的问题,请参考以下文章

AWS lambda 调用不调用另一个 lambda 函数 - Node.js

AWS:Lambda函数无法使用EC2实例的私有API调用rest api

aws lambda函数调用内部负载均衡器

AWS Appsync 从 Lambda 调用变异?

[使用AWS lambda函数每1小时更新Firebase数据库

如何使用API 参考对AWS Lambda进行API调用