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

执行PutItem时发生ValidationException:项中缺少键:ClientError

罗昊明
2023-03-14

我在Python 2.7中配置了一个AWS Lambda,用于从Firehose交付流中读取事件,并写入DynamoDB表“My_Tab”,其中属性“element_class”(类型字符串)作为分区键

import json
import boto3

def lambda_data_handler(event, context):

    dynamodb = boto3.resource('dynamodb', region_name='ap-south-1')
    table = dynamodb.Table('My_Tab')

    response = table.put_item(Item = event)
    print(json.dumps(response))
    print("Row-" + str(index) + " written to DynamoDB successfully")

对于流式传输到Firehose,我是对JSON文件进行二进制编码my_data.json然后使用AWS CLI put-记录实用程序发送数据,如下所示:

c:\Program Files\Amazon\AWSCLI>aws firehose put-record --delivery-stream-name My_Dlv_Stream --record file://C:/Users/somnath/my_data.json
{
    "RecordId": "DvH2dm5W75F9+bwjJesUW8FoPqQZJOF66etwGoWUycMX..."
}

json文件my_data.json有一个JSON记录,如下所示:

{"Data":"{\"element_class\":\"1001\"}\n"}

但是数据没有被写入DynamoDB表My_Tab,下面是CloudWatch错误日志:

An error occurred (ValidationException) when calling the PutItem operation: One or more parameter values were invalid: Missing the key element_class in the item: ClientError
Traceback (most recent call last):
File "/var/task/lambda_KFH_2_DynDB.py", line 21, in lambda_data_handler
response = table.put_item(Item = event)
File "/var/task/boto3/resources/factory.py", line 520, in do_action
response = action(self, *args, **kwargs)
File "/var/task/boto3/resources/action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params)
File "/var/task/botocore/client.py", line 314, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/task/botocore/client.py", line 612, in _make_api_call
raise error_class(parsed_response, operation_name)
ClientError: An error occurred (ValidationException) when calling the PutItem operation: One or more parameter values were invalid: Missing the key element_class in the item

共有1个答案

谢和同
2023-03-14

只是添加了下面的代码来从事件的记录属性的记录ID中提取数据,而不是直接获取事件。它奏效了。

    it = json.loads(event['records'][0]['data'])
    response = table.put_item(Item = it)

@blueCat:感谢指向打印事件。我期望的数据格式是错误的。

 类似资料:
  • 我的STS版本:3.7.1.RELEASE,内部版本Id:201510041213,平台:Eclipse Mars。1(4.5.1)在选择例如Spring Starter project时没有创建正确的项目 当与我现有的一个项目进行比较时,我可以看到缺少了Builder。创建的项目仅包含Maven Builder 我的参考项目有Maven、Java和Spring project Builders。

  • 问题内容: 我正在尝试使用以下命令运行jdeps: 我依赖于应用程序模块和自动模块。我将所有依赖项放在“模块”文件夹中,但出现错误: 但是,当我添加时,它工作正常。 难道我做错了什么?我以为jdeps会找到所有模块,而不是手动添加它们。 问题答案: 执行以下命令时: 从目录解析的模块是 可观察的模块 ,在您的情况下,它们无法进入 根模块集 。 在问题的另一部分- 另一方面,显式添加它们可确保模块存

  • 试图围绕Docker、WSL2、发行版、图像和容器进行思考。WSL发行版和Docker映像有什么区别?查看以下两个快照,看起来这些是不同的东西: WSL中已安装的发行版列表: Docker Desktop中的图像列表: Alpine和Ubuntu列在附加发行版列表中,但没有出现在图像列表中。 我应该如何将一个已安装的WSL发行版(Alpine或Ubuntu)作为容器运行并到达它的终端?最后,我可以

  • 我在这里得到的错误是 而如果我对springboot执行器提供的任何其他endpoint重复相同的请求,我就会正确地获得响应,例如,我尝试了/acturet/health,/acturet/info,/acturet/metrics等。 只有在使用@springboot注释的集成测试中才会出现这种情况,这很奇怪,因为如果我运行应用程序并用postman向地址localhost:8080/actul

  • 我在构建APK时收到此错误。 试图使缓存无效并重新启动android studio。重建项目,但没有一个适合我。

  • 我有一个小的Maven应用程序,它使用JaCoCo进行测试覆盖报告。我不断得到以下错误: 由于缺少执行数据文件,正在跳过JaCoCo执行 这是我的POM。xml文件。我自己删除了项目元素。 这是我的主类,它位于结构下: 这是带有单元测试的类,它位于结构下: 我该如何解决这个问题?