Lambda调用DynamoDB update_item报Invalid UpdateExpression错误如何解决
问题原因
你报错的核心原因是boto3 Resource API 和低层级Client API的参数格式要求不一致:
- 你Lambda里用的是
boto3.resource('dynamodb').Table()这个Resource层接口,它会自动完成Python原生类型和DynamoDB数据类型的转换,不需要主动加{"S":"xxx"}/{"N":"1"}这类类型标记 - 你传入的参数里加了类型标记后,boto3会把整个结构识别为Map类型(也就是错误提示里的
M类型),自然无法支持+号的数值运算 - NoSQL Workbench和AWS CLI默认调用的是低层级的DynamoDB API,要求必须带类型标记,所以同一份参数在这两个场景下可以正常运行
修复方案
提供两种可选修复方式,二选一即可:
方案1:修改请求参数格式(推荐,适配现有Lambda代码)
去掉payload里所有的类型标记,直接传原生值即可,修改后的测试请求如下:
{ "operation": "update", "tableName": "CCDynamoDB", "payload": { "Key": { "id": "visitorCount" }, "UpdateExpression": "SET #7c680 = #7c680 + :7c680", "ExpressionAttributeNames": {"#7c680":"currentCount"}, "ExpressionAttributeValues": {":7c680": 1} } }
方案2:修改Lambda代码适配带类型标记的参数
如果需要保留带类型标记的传参格式,把Lambda里的Resource API替换为低层级Client API即可:
- 将资源初始化代码替换为:
dynamo = boto3.client('dynamodb')
- 调整operationsDict里的所有DynamoDB操作,统一传入TableName参数:
operationsDict = { 'create': lambda x: dynamo.put_item(TableName=event['tableName'], **x), 'read': lambda x: dynamo.get_item(TableName=event['tableName'], **x), 'update': lambda x: dynamo.update_item(TableName=event['tableName'], **x), 'delete': lambda x: dynamo.delete_item(TableName=event['tableName'], **x), 'list': lambda x: dynamo.scan(TableName=event['tableName'], **x), 'echo': lambda x: x, 'ping': lambda x: 'pong' }
内容的提问来源于stack exchange,提问作者manach
相关产品推荐
相关产品推荐

