You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可:

  1. 将资源初始化代码替换为:
dynamo = boto3.client('dynamodb')
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:45:03