Получение ошибки Неверный тип для параметра Item, значение: type:, допустимые типы:при загрузке S3 в DynamoDB - PullRequest
0 голосов
/ 04 февраля 2019

Я новичок в AWS и обучения.У меня есть файл JSON с информацией о сотрудниках в папке S3.Написал лямбда-функцию с PYTHON 3.6 для загрузки таблицы DynamoDB XXXXX-YYYY-ZZZZ-Employees, когда файл JSON загружен на S3.Все настройки были сделаны с политикой и ролями для доступа к CloudwatchLog, S3 и DynamoDB.Файл журнала дает ошибку ниже.Похоже, что проблема в том, что файл представляет собой словарь в формате, подобном [], и put_item ожидает строку ... не уверен.

(empid - это первичный ключ)

Проверен код и исследована проблема вфорумы google и AWS

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()
    #print(jsonFileReader)
    jsonDict = json.loads(jsonFileReader)
    #print(jsonDict)
    table = dynamodb.Table('XXXXXX-YYYYY-ZZZZZZ-Employees')
    table.put_item(Item=jsonDict)    
return {
    'statusCode': 200,
    'body': json.dumps('Hello from Lambda!')
}

Ожидаемый результат: таблица DynamoDB загружена с данными файла JSON Фактический результат: получена ошибка в cloudwatchlog:

Недопустимый тип для параметра Item, значение: [{'empid': 10004, «электронная почта»: «test1@email.com», «имя»: «John5», «фамилия»: «Smith5», «местоположение»: «ABCD-B207», «мобильный»: «123-456-7890 ',' work ':' 098-765-4321 ',' site ':' ABCD '}, {' empid ': 10005,' email ':' test1@email.com ',' firstname ':' John6 ', ................. '}], тип:, допустимые типы:

1 Ответ

0 голосов
/ 04 февраля 2019

Ваше программирование читает весь файл в jsonDict.Затем вы пытаетесь вставить один элемент , используя словарь.

Вместо этого вы должны извлечь по одной строке за раз, а затем использовать put_item() для вставки одного элемента.Повторите для каждой строки.

Нечто подобное может быть возможным:

jsonDict = json.loads(jsonFileReader)
table = dynamodb.Table('XXXXXX-YYYYY-ZZZZZZ-Employees')
for item in jsonDict:
    table.put_item(Item=item)  
...