首页 > 解决方案 > 如何从 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 检索记录?

标签: pythonamazon-web-servicesaws-lambdaamazon-dynamodbboto3

解决方案


我测试了你的代码,它工作得很好:

  • 首先,我创建了一个 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'],因为它可能没有返回您期望的值。

推荐阅读