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

LocalStack Lambda中使用Boto3 DynamoDB资源时KeyConditionExpression类型错误

本地与LocalStack中Lambda使用boto3 DynamoDB资源结果不一致

问题背景

在本地机器和LocalStack的Lambda函数中使用boto3 DynamoDB资源时,出现结果不一致的问题。编写了一个仅基于哈希键查询表的Lambda处理程序,代码如下:

import boto3
from boto3.dynamodb.conditions import Key
import os

def handler(event, context):
    dynamodb = boto3.resource(
        "dynamodb", endpoint_url=os.environ["AWS_EP"]
    )
    table = dynamodb.Table("precalculated_scores")
    items = table.query(
        KeyConditionExpression=Key("customer_id").eq(event["customer_id"])
    )
    return items

环境变量AWS_EP在原型开发时设置为LocalStack的DNS地址:http://localstack:4566。

错误信息

调用Lambda时收到如下参数校验错误:

{
    "errorMessage": "Parameter validation failed:\nInvalid type for parameter KeyConditionExpression, value: <boto3.dynamodb.conditions.Equals object at 0x7f7440201960>, type: <class 'boto3.dynamodb.conditions.Equals'>, valid types: <class 'str'>",
    "errorType": "ParamValidationError",
    "stackTrace": [
        "  File \"/opt/code/localstack/localstack/services/awslambda/lambda_executors.py\", line 1423, in do_execute\n    execute_result = lambda_function_callable(inv_context.event, context)\n",
        "  File \"/opt/code/localstack/localstack/services/awslambda/lambda_api.py\", line 782, in exec_local_python\n    return inner_handler(event, context)\n",
        "  File \"/var/lib/localstack/tmp/lambda_script_l_dbef16b3.py\", line 29, in handler\n    items = table.query(\n",
        "  File \"/opt/code/localstack/.venv/lib/python3.10/site-packages/boto3/resources/factory.py\", line 580, in do_action\n    response = action(self, *args, **kwargs)\n",
        "  File \"/opt/code/localstack/.venv/lib/python3.10/site-packages/boto3/resources/action.py\", line 88, in __call__\n    response = getattr(parent.meta.client, operation_name)(*args, **params)\n",
        "  File \"/opt/code/localstack/.venv/lib/python3.10/site-packages/botocore/client.py\", line 514, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
        "  File \"/opt/code/localstack/.venv/lib/python3.10/site-packages/botocore/client.py\", line 901, in _make_api_call\n    request_dict = self._convert_to_request_dict(\n",
        "  File \"/opt/code/localstack/.venv/lib/python3.10/site-packages/botocore/client.py\", line 962, in _convert_to_request_dict\n    request_dict = self._serializer.serialize_to_request(\n",
        "  File \"/opt/code/localstack/.venv/lib/python3.10/site-packages/botocore/validate.py\", line 381, in serialize_to_request\n    raise ParamValidationError(report=report.generate_report())\n"
    ]
}

排查过程

  • 该错误通常出现在使用boto3客户端而非资源的场景,但此处明确使用boto3资源。
  • 本地代码运行正常,最初怀疑是boto3版本差异(本地1.24.96,Lambda运行时1.16.31),但将本地版本降级至与运行时一致后,问题仍未解决。
  • 代码对接真实AWS服务可正常运行,但在LocalStack上始终报错。
  • 更新1:修改返回值为{"statusCode": 200, "body": json.dumps(items)},问题未解决。
  • 更新2:确认代码在真实AWS环境正常,仅LocalStack环境异常。

解决方案

1. 升级LocalStack版本

该错误大概率是LocalStack版本与使用的boto3版本不兼容导致的旧bug——旧版本LocalStack无法正确识别boto3资源的KeyConditionExpression条件对象,误将其当作字符串参数校验。

建议升级LocalStack到最新稳定版本,或匹配与boto3 1.16.31兼容的LocalStack版本。

2. 临时替代:使用原生表达式格式

如果暂时无法升级LocalStack,可改用DynamoDB原生的字符串表达式格式,配合ExpressionAttributeValues传递参数,绕过LocalStack的校验问题:

import boto3
import os
import json

def handler(event, context):
    dynamodb = boto3.resource(
        "dynamodb", endpoint_url=os.environ["AWS_EP"]
    )
    table = dynamodb.Table("precalculated_scores")
    items = table.query(
        KeyConditionExpression="customer_id = :cid",
        ExpressionAttributeValues={":cid": event["customer_id"]}
    )
    return {"statusCode": 200, "body": json.dumps(items)}

这种写法对boto3资源和客户端都兼容,LocalStack对原生表达式的支持更稳定。

3. 校验Lambda运行时依赖版本

检查LocalStack中Lambda执行环境的boto3/botocore版本是否符合预期,有时LocalStack自带的依赖版本会与代码预期不符。可在Lambda代码中添加版本打印:

import boto3
import botocore
print(f"boto3 version: {boto3.__version__}")
print(f"botocore version: {botocore.__version__}")

如果版本不符,可通过打包自定义依赖层的方式,将指定版本的boto3/botocore打包到Lambda中,覆盖LocalStack默认依赖。


内容的提问来源于stack exchange,提问作者hemagso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:20:20