当前位置: 首页 > 知识库问答 >
问题:

如何从AWS Lambda内部访问Dynamodb?

郭云
2023-03-14

如何从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应该返回包含字典的对象,但它实际上返回:

{'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}}

为什么没有提供项目?如何从Dynamo检索记录?

共有1个答案

公西宏峻
2023-03-14

我测试了你的代码,效果非常好:

  • 首先,我创建了一个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']做什么,因为它可能没有返回您期望的值。
 类似资料:
  • 问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例:

  • 问题内容: 这不是直截了当的问题。在我的情况下,外部类变量和内部类setter方法的参数名称相同。喜欢: 现在,我无法初始化外部类实例变量p,因为它指示内部类。再次,我做不到它得到一个错误。现在如何分配外部p,同时将内部Class方法的参数命名为p? 问题答案: 这是您可以/应该这样做的方式:

  • 这不是直截了当的问题。在我的例子中,外部类变量和内部类setter方法的参数名称是相同的。比如: 现在我不能用初始化外部类实例变量p,因为它指示内部类。同样,我不能执行会出现错误。现在,我如何分配外部p,使内部类方法的参数与名称p相同?

  • 我已经创建了JavaSwing应用程序,其中包含一个jDesktoppane,在它里面我正在从主框架(JFrame)中的切换按钮加载/调用一些内部框架。我使用了jButton组来切换所有的按钮,所以当按下一个按钮时,只有一个帧会切换。 由于我使用了切换按钮,即使我配置了JInternalFrame,相关切换按钮仍将处于按下模式(已选择)。我尝试了很多方法,但无法将切换按钮的状态从选中更改为未选中。

  • 我正在使用Java文本编辑器(Swing)。到目前为止,我已经做了身体。我有这个功能的问题: 新建(JMenuItem)(清空JTextArea的内容) 当用户单击该按钮时,JTextArea内容应替换为空字符串。这是我的代码(我正在使用与问题无关的代码,例如创建菜单、添加菜单项,只添加类。) 这是TextArea类: (如你所见,是空的。) 这是MenuBar类: 这是类构造函数,我在其中添加了

  • 问题内容: 如何从内部类访问外部类? 我正在重写一种使它在不同线程上运行的方法。从内联线程中,我需要调用原始方法,但是当然只要调用就会变成无限递归。 具体来说,我在扩展BufferedReader: 这个地方给了我我找不到的NullPointerException。 谢谢。 问题答案: 像这样: 上面的测试在执行时显示: