You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:06:31