python - 如何从 AWS Lambda 内部访问 Dynamodb?
问题描述
如何从 AWS Lambda 函数中读取 Dynamodb 记录?
我正在尝试get_item
通过以下方式拨打电话:
import os
import boto3
def handler(event, context):
id = event['id']
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('mytable')
response = table.get_item(
Key={
'id': id,
}
)
print('response:', response)
item = response['Item']
return {}
但是当我通过 Lambda 测试工具运行测试时,它失败并出现错误:
{
"errorMessage": "'Item'",
"errorType": "KeyError",
"stackTrace": [
" File \"/var/task/main.py\", line 33, in handler\n item = response['Item']\n"
]
}
即使文档说get_item
应该返回一个包含Item
字典的对象,它实际上返回:
{'ResponseMetadata': {'RequestId': 'DIDH3KVSPP1LU7O0TBLGP701QRVV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Thu, 24 Oct 2019 03:15:42 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '2', 'connection': 'keep-alive', 'x-amzn-requestid': 'DIDH3KVSPP1LU7O0TBLGP701QRVV4KQNSO5AEMVJF66Q9ASUAAJG', 'x-amz-crc32': '2745614147'}, 'RetryAttempts': 0}}
为什么Item
不提供?如何从 Dynamo 检索记录?
解决方案
我测试了你的代码,它工作得很好:
- 首先,我创建了一个 DynamoDB 表,其主键名为
id
- 然后我在表中添加了一些项目
- 然后我运行了您的代码,并对我的表进行了更改:
import boto3
def handler(event, context):
id = 'food'
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('stack')
response = table.get_item(
Key={
'id': id,
}
)
print('response:', response)
item = response['Item']
return {}
这返回:
response: {'Item': {'id': 'food', 'name': 'apple'}, 'ResponseMetadata': {'RequestId': '...', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Thu, 24 Oct 2019 04:38:35 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '49', 'connection': 'keep-alive', 'x-amzn-requestid': '...', 'x-amz-crc32': '...'}, 'RetryAttempts': 0}}
注意Item
返回数据前面的 。
它对您不起作用的一些可能原因:
- 您收到了一个
KeyError
. 检查您的主键是否被调用id
以匹配调用中的代码get_item()
。 - 该表可能没有任何
id
设置为所请求值的条目。当我尝试这个时,我收到了与您收到的完全相同的错误消息。因此,请检查您的代码在做什么id = event['id']
,因为它可能没有返回您期望的值。
推荐阅读
- sql - 2条sql的SQL性能比较
- sql - SQL:在相关子查询中加入(SEMI JOIN)
- python - Heroku 和 Aiohttp - 这会导致问题吗?
- c++ - 无法使用 QML 远程对象连接错误:“connectionToSource 为空”
- flutter - Flutter Image Picker 强制用户拍摄视频而不是图片
- oracle - PL/SQL 中的错误“必须声明标识符”是什么意思?
- php - 如何将 Apple Pay 令牌发送到 Stripe?
- javascript - 在Javascript中为获取设置标头时哪个更好?
- javascript - 从对象数组访问 JSON 数据,然后从数组中的对象访问
- notifications - 浏览器通知在 Firefox 附加组件中不起作用