代码之家  ›  专栏  ›  技术社区  ›  somnathchakrabarti

执行PutItem:时验证异常缺少项中的键:ClientError

  •  2
  • somnathchakrabarti  · 技术社区  · 7 年前

    我已经在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 record实用程序发送数据,如下所示:

    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"}
    

    但使用以下CloudWatch错误日志无法将数据写入dynamodb表my_选项卡:

    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 回复  |  直到 7 年前
        1
  •  1
  •   somnathchakrabarti    7 年前

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