AWS Lambda使用aioboto3操作DynamoDB遇AttributeError问题求助
解决aioboto3调用DynamoDB时的AttributeError问题
问题根源
你遇到的AttributeError: 'ResourceCreatorContext' object has no attribute 'Table'是因为aioboto3的资源创建逻辑和boto3存在差异:
- boto3中
Session().resource('dynamodb')直接返回资源实例,可直接调用Table方法 - aioboto3中
Session().resource('dynamodb')返回的是ResourceCreatorContext上下文对象,必须先通过await或async with获取实际的DynamoDB资源实例,才能访问Table属性
修正代码
以下是修复后的完整代码,同时解决了原代码中item为None时访问item['date']会抛出异常的问题:
import os import json import asyncio import datetime import aioboto3 def get_hello(event, context): loop = asyncio.get_event_loop() return loop.run_until_complete(get_hello_async(event, context)) async def get_hello_async(event, context): name = event['queryStringParameters']['name'] item = await get_item(name) if item and item.get('date'): date = datetime.datetime.fromtimestamp(item['date'] / 1000) message = 'Was greeted on {}'.format(date.strftime('%m/%d/%Y, %H:%M:%S')) return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Origin': '*', }, 'body': json.dumps(message) } else: return { 'statusCode': 404, 'headers': { 'Access-Control-Allow-Origin': '*', }, 'body': json.dumps('No greeting record found') } async def get_item(name): # 使用async with上下文管理器获取并管理DynamoDB资源 async with aioboto3.Session().resource('dynamodb') as dynamodb: table = dynamodb.Table(os.environ['TABLE_NAME']) record = await table.get_item(Key={'name': name}) return record.get('Item')
关键修改点
- 资源实例获取:用
async with上下文管理器获取DynamoDB资源实例,避免直接操作ResourceCreatorContext对象 - 空值安全处理:添加
item and item.get('date')的判断,防止item为None时触发KeyError - 资源生命周期管理:
async with会自动处理资源的关闭,避免资源泄漏
内容的提问来源于stack exchange,提问作者Eduardo G
相关产品推荐
相关产品推荐

