Python - put_item () S3, Lambda, DynamoDB - Произошла ошибка (ValidationException) - PullRequest
0 голосов
/ 22 января 2019

Я использую python с AWS S3, лямбду и DynamoDB. Моя лямбда-функция настроена как триггер. Когда я помещаю файл .json в корзину S3, он активируется.

Когда моя функция активируется, происходит ошибка, когда она достигает моего вызова функции put_item, который должен хранить объект json в моей таблице dynamicodb.

Текст ошибки:

[ERROR] ClientError: An error occurred (ValidationException)
when calling the PutItem operation: One or more parameter values
were invalid: Missing the key test in the item

Я пытался изменить аргументы в пределах table.put_item(TableName='testTable', Item = jsonDict), но документы, за которыми я следовал, передали только один аргумент этой функции.

Любой совет или помощь будет принята с благодарностью.

Мой код гласит:

import boto3
import json

s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    json_file_name = event['Records'][0]['s3']['object']['key']
    json_object = s3_client.get_object(Bucket=bucket,Key=json_file_name)
    jsonFileReader = json_object['Body'].read()
    jsonDict = json.loads(jsonFileReader)
    table = dynamodb.Table('test')
    table.put_item(Item = jsonDict)

    return 'Hello from lambda'

Журналы ОБЛАЧНЫХ ЧАСОВ:

[ERROR] ClientError: An error occurred (ValidationException) when
calling the PutItem operation: One or more parameter values were
invalid: Missing the key test in the item
Traceback (most recent call last):

  File "/var/task/lambda_function.py", line 14, in lambda_handler
    response = table.put_item(Item = jsonDict)
  File "/var/runtime/boto3/resources/factory.py", line 520, in do_action
    response = action(self, *args, **kwargs)
  File "/var/runtime/boto3/resources/action.py", line 83, in __call__
    response = getattr(parent.meta.client, operation_name)(**params)
  File "/var/runtime/botocore/client.py", line 320, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 623, in _make_api_call
    raise error_class(parsed_response, operation_name)

редактирует:

Я создал свою таблицу с первичным ключом 'test' и именем таблицы 'test', оставив все остальные настройки по умолчанию в графическом интерфейсе создания динамо-таблицы AWS.

Содержимое файла json:

{"test": {"name": "Cody", "age": 27, "car": true}}

1 Ответ

0 голосов
/ 22 января 2019

Вы пытаетесь использовать {"name": "Cody", "age": 27, "car": true} в качестве значения первичного ключа. В DynamoDB первичный (разделительный) ключ может иметь только строку типа , двоичный код или число .

Например, можно использовать {"test": "Cody", "age": 27, "car": True} в качестве аргумента Item для put_item.

Или, если вы измените имя ключа раздела в таблице на name, вызов table.put_item(Item=jsonDict['test']) также поможет.

...