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

如何通过Lambda函数将S3中的多份CSV文件导入DynamoDB(JSON格式)

使用Lambda将S3中的CSV转JSON并导入DynamoDB的方案及替代选项

我来给你详细拆解怎么用Lambda实现这个需求,另外还有几个实用的替代方案,你可以根据自己的场景选~

一、用Lambda函数实现的完整步骤

整个流程是:S3上传CSV后自动触发Lambda → Lambda读取CSV内容转成JSON → 批量写入DynamoDB。具体操作如下:

1. 给Lambda配置必要的权限

Lambda得有三个关键权限才能干活:

  • 读取目标S3桶的权限(s3:GetObject)
  • 写入指定DynamoDB表的权限(dynamodb:BatchWriteItem)
  • 生成日志的权限(方便排查问题,logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents)
    你可以去IAM控制台新建一个角色,把包含这些权限的策略附加给它,然后把这个角色分配给你的Lambda函数就行。

2. 设置S3触发Lambda的规则

打开S3控制台找到你的桶,进入「属性」→「事件通知」,新建一个通知:

  • 事件类型选「所有对象创建事件」或者「Put」(看你是要触发所有上传还是仅特定操作)
  • 可以设置前缀/后缀过滤,比如只对.csv后缀的文件触发
  • 目标选Lambda函数,指定你要创建的那个函数

3. 编写Lambda函数代码(Python示例)

Python处理CSV和JSON特别顺手,Lambda对Python的支持也很成熟,给你个参考代码:

import boto3
import csv
import json

# 初始化服务客户端
s3 = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
# 替换成你的DynamoDB表名
table = dynamodb.Table('your-dynamodb-table-name')

def lambda_handler(event, context):
    # 从S3事件里拿到文件信息
    record = event['Records'][0]
    bucket_name = record['s3']['bucket']['name']
    file_key = record['s3']['object']['key']
    
    # 读取S3里的CSV文件
    response = s3.get_object(Bucket=bucket_name, Key=file_key)
    csv_content = response['Body'].read().decode('utf-8').splitlines()
    
    # 把CSV解析成字典列表(也就是JSON格式的结构)
    csv_reader = csv.DictReader(csv_content)
    items = []
    for row in csv_reader:
        # 这里可以根据你的DynamoDB表结构调整字段,比如把字符串转成数字、处理日期等
        items.append({'PutRequest': {'Item': row}})
    
    # 批量写入DynamoDB,注意一次最多写25条,所以要拆分列表
    if items:
        for i in range(0, len(items), 25):
            batch = items[i:i+25]
            table.batch_writer().batch_write_item(RequestItems={table.name: batch})
    
    return {
        'statusCode': 200,
        'body': json.dumps(f'成功处理 {len(items)} 条数据')
    }

几个要注意的点:

  • 确保CSV的表头和DynamoDB表的字段名对应,要是不一样,得在代码里做字段映射
  • DynamoDB的主键字段必须存在,不然写入会失败
  • 如果CSV文件很大,记得调整Lambda的超时时间(默认3秒,大文件可以调到5分钟)和内存(比如1024MB),避免中途挂掉

4. 测试验证

手动上传一个测试CSV到S3,然后去CloudWatch Logs看Lambda的运行日志,或者直接去DynamoDB表里检查数据有没有成功导入。


二、其他可行的解决方案

如果Lambda不是你的菜,还有这几个方案可以选:

1. AWS Glue(适合大规模数据ETL)

Glue是专门的ETL服务,适合处理大量数据的场景:

  • 先创建Glue爬虫,爬取S3里的CSV文件,自动生成表结构
  • 再创建Glue作业,写个ETL脚本把CSV转成JSON,然后写入DynamoDB
  • 可以设置定时触发,或者当S3有新文件时自动触发作业
    优点是能处理超大批量数据,不用自己管服务器;缺点是配置相对复杂一点,适合有一定AWS基础的用户。

2. Amazon Athena + DynamoDB(适合需要先过滤数据的场景)

如果你需要先对CSV数据做查询过滤,再导入DynamoDB,可以用这个组合:

  • 先在Athena里创建外部表,关联S3的CSV文件
  • 然后用INSERT INTO语句把查询结果直接写入DynamoDB(要给Athena配好写入DynamoDB的权限)
    这种方式不用写代码,用SQL就能搞定,适合懂SQL的用户。

3. 本地脚本+AWS CLI(适合一次性需求)

如果只是一次性处理,不需要自动化,那直接写个本地脚本就行:

  • 用AWS CLI把S3的CSV文件下载到本地
  • 用Python/Java等语言把CSV转成JSON
  • 再用AWS CLI或者SDK把JSON数据批量写入DynamoDB
    优点是简单快速,不用配置各种服务;缺点是不能自动触发,每次都得手动跑脚本。

内容的提问来源于stack exchange,提问作者Walid Sliti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:14:35