You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动