如何从AWS Lambda内部访问Dynamodb?

时间:2019-10-24 03:24:36

标签: python amazon-web-services aws-lambda amazon-dynamodb boto3

您如何从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"
  ]
}

即使docsget_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检索记录?

1 个答案:

答案 0 :(得分:2)

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

  • 首先,我创建了一个名为id的主键DynamoDB表
  • 然后我在表中添加了一些项目
  • 然后运行您的代码,并对表进行更改:
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']的处理方式,因为它可能没有返回您期望的值。