获取错误参数Item的类型无效,值:类型:<class'list'=“”>,有效类型:<class'dict'=“”>将S3加载到DynamoDB

时间:2019-02-03 22:09:19

标签: amazon-web-services aws-lambda boto3

我是AWS和学习的新手。我在S3文件夹中有一个包含员工详细信息的JSON文件。将JSON文件上传到S3时,使用PYTHON 3.6编写了Lambda函数以加载DynamoDB表XXXXX-YYYY-ZZZZ-Employees。所有设置均已通过策略和角色完成,以访问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,'email':'test1@email.com','first'':'John5','lastname':'Smith5','location' :'ABCD-B207','移动电话':'123-456-7890','工作':'098-​​765-4321','站点':'ABCD'},{'empid':10005,'email' :'test1@email.com','名字':'John6',.................'}],键入:,有效类型:

1 个答案:

答案 0 :(得分:1)

您的程序正在将整个文件读入jsonDict。然后,您尝试使用字典插入一项

相反,您应该一次提取一行,然后使用put_item()插入一项。对每行重复一次。

可能会发生以下情况:

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