AWS Lambda写入DynamoDB遇ParamValidationError问题求助
问题解决:Lambda写入DynamoDB时出现ParamValidationError
问题背景
配置Lambda触发器将S3中的JSON数据上传至DynamoDB时,触发ParamValidationError,错误提示Item参数类型为字符串,要求传入字典类型。DynamoDB表仅设置了字符串类型主键PlayerWeekID,其余字段未预先配置。
错误根源
从错误信息和代码来看,问题出在JSON数据的生成与上传环节:
- 原代码中
dffinal.to_json(orient='records', lines=True)已经生成了每行一个JSON对象的字符串,却又用json.dumps()对该字符串再次进行JSON序列化,导致存入S3的是被转义的字符串型JSON。 - Lambda读取后通过
json.loads()解析得到的仍然是字符串,而非DynamoDBput_item方法需要的字典类型,因此触发参数验证错误。
修复方案
1. 修正S3数据上传代码
去掉多余的json.dumps(),直接将DataFrame生成的JSON字符串上传至S3:
# 将DataFrame转为每行一个JSON对象的字符串 sdl_fpl_data = dffinal.to_json(orient='records', lines=True) s3 = boto3.resource('s3') obj = s3.Object('bucket-name','sdl_fpl_data.json') # 直接传入生成的JSON字符串,无需二次序列化 obj.put(Body=sdl_fpl_data)
2. 修正Lambda处理代码
由于使用orient='records', lines=True生成的是多行JSON格式(每行一个独立的JSON对象),Lambda需要逐行解析并写入DynamoDB:
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) # 读取内容并解码为UTF-8字符串 json_content = json_object['Body'].read().decode('utf-8') table = dynamodb.Table('my-table') # 逐行处理每个JSON记录 for line in json_content.splitlines(): if line.strip(): # 跳过空行 json_dict = json.loads(line) table.put_item(Item=json_dict) return { 'statusCode': 200, 'body': '数据批量写入DynamoDB成功' }
额外说明
DynamoDB是无schema的数据库,除主键外无需预先配置其他字段类型,Lambda传入的字典会自动识别字段类型并存储,因此不需要在DDB中预先配置其他字段。
内容的提问来源于stack exchange,提问作者mgd6
相关产品推荐
相关产品推荐

