AWS Lambda初始化错误:未定义'dynamodb',IoT按钮查DynamoDB求助
解决AWS Lambda中"name 'dynamodb' is not defined"的模块初始化错误
这个错误的根源很清晰:你的代码尝试引用dynamodb对象,但从来没有创建过这个对象的实例。从你给出的代码片段来看,你已经导入了boto3库,但缺少关键的DynamoDB客户端/资源初始化步骤。下面是具体的修复方案:
1. 初始化DynamoDB实例
在你的lambda_handler函数内部(或者模块全局范围,根据你的需求选择)创建DynamoDB的资源或客户端实例。推荐使用资源方式,因为它更面向对象,操作DynamoDB表更方便:
# 在lambda_handler内初始化(推荐,避免冷启动时的不必要复用问题) dynamodb = boto3.resource('dynamodb') # 如果你的资源在特定区域,显式指定区域会更稳妥 # dynamodb = boto3.resource('dynamodb', region_name='us-west-2')
如果习惯用客户端方式,也可以这样写:
dynamodb = boto3.client('dynamodb')
2. 完善查询逻辑并补全DecimalEncoder类
接下来,你需要获取目标表,执行查询,同时要补全未写完的DecimalEncoder类(因为DynamoDB返回的Decimal类型无法直接用JSON序列化)。完整的代码片段大概是这样:
from __future__ import print_function import boto3 import json import decimal from boto3.dynamodb.conditions import Key, Attr # 补全DecimalEncoder类,处理DynamoDB的Decimal类型 class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): # 根据Decimal值的类型转换为int或float return int(o) if o % 1 == 0 else float(o) return super(DecimalEncoder, self).default(o) def lambda_handler(event, context): print ('Init 1Push_Care_DATAprint') print (event) # 从事件中获取serialNumber serialNumber = event['serialNumber'] # 初始化DynamoDB资源 dynamodb = boto3.resource('dynamodb') # 替换成你的实际表名 table = dynamodb.Table('Your_DynamoDB_Table_Name') # 执行查询(假设serialNumber是表的主键) response = table.query( KeyConditionExpression=Key('serialNumber').eq(serialNumber) ) # 打印查询到的所有行数据 for item in response['Items']: print(json.dumps(item, cls=DecimalEncoder)) # 可选:返回查询结果给调用方 return { 'statusCode': 200, 'items': json.dumps(response['Items'], cls=DecimalEncoder) }
3. 额外注意事项
- 确保你的Lambda执行角色拥有DynamoDB的
query权限,否则会出现权限错误。 - 如果
serialNumber不是表的主键,而是全局二级索引(GSI)的键,需要在query中指定IndexName参数。
内容的提问来源于stack exchange,提问作者Osiris.N




