一个或多个参数值无效:键 xyz 的类型不匹配预期:S 实际:M

问题描述 投票:0回答:2

我的 AWS Lambda 根据此答案调用 DynamoDB:https://stackoverflow.com/a/33649402/495455

我收到错误:

一个或多个参数值无效:键的类型不匹配 用户名预期:S 实际:M

这是Python代码,但JavaScript等也会发生错误:

import json
import boto3
client = boto3.resource('dynamodb')
table = client.Table("DS-Users")

def lambda_handler(event, context):

    UserName = event['UserName']
    Email = event['Email']
    Score = event['Score']
    Mobile = event['Mobile']
    CountryId = event['CountryId']
    Level = event['Level']
    Magic = event['Magic']

    table.put_item(Item={'UserName':{'S':UserName},'Email':{'S':Email},'Score':{'N':Score},'Level':{'N':Level},'Mobile':{'S':Mobile},'Magic':{'S':Magic}})

    return {
        'statusCode': 200,
        'body': json.dumps(event)
    }

研究错误会得到一些无法解决上述错误的答案:

  1. https://github.com/awslabs/dynamodb-document-js-sdk/issues/17

  2. https://forums.aws.amazon.com/thread.jspa?threadID=248424

我很困惑,因为 UserName 是一个字符串,我在集成请求映射模板中强制执行它:

#set($inputRoot = $input.path('$'))
{
  "UserName" : "$inputRoot.UserName",

有什么想法吗?为什么它将字符串视为模型数据类型?

aws-lambda amazon-dynamodb aws-sdk type-mismatch
2个回答
39
投票

首先注意AWS SDK V1与V2的版本!

另请注意 boto3 的客户端与资源 API 的语法。

{'UserName':{'S':UserName}
是用于 boto3 客户端的语法,此解决方案适用于 boto3 资源变体。

boto3 客户端 put_item 参考 – https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.put_item

boto3 资源 put_item 参考 - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Table.put_item

客户端语法

{'UserName':{'S':UserName},

资源语法

{'UserName':UserName,

对于我的具体情况,这解决了它:

table.put_item(Item={'UserName':UserName,'Email':Email,'Score':Score,'Level':Level,'Mobile':Mobile,'Magic':Magic})

0
投票

检查 DynamoDB 表上的主键类型

创建 AWS DynamoDB 表时,需要设置 主键名称和类型(请参阅此处的详细信息:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents。 html#HowItWorks.CoreComponents.PrimaryKey)

每个主键属性必须是标量(意味着它只能保存单个值)。主键属性允许的唯一数据类型是“字符串、数字或二进制”。对于其他非关键属性则没有此类限制。

发送不带类型字典信息的键值

因此,在 boto3 中,当您转到

put_item(Item='...)

时,您不需要包含主键的类型信息。 Dynamo 需要您在创建表时设置的类型,因此当然没有必要再次传递该信息。

错误 预期键 UserName 的类型不匹配:S 实际:M 是准确的,因为您传递的是字典(即 Map 或“M”类型):

'UserName':{'S':UserName}

  • 而不是传递字符串(即您的事件['UserName'])

'UserName': UserName}

© www.soinside.com 2019 - 2024. All rights reserved.