Python AWS Lambda如何处理S3上传文件?求实现示例
S3上传JSON后自动转CSV的Lambda实现方案
Lambda工作逻辑说明
当文件上传到S3指定桶时,S3会发送事件通知给关联的Lambda函数。Lambda不需要手动指定要处理的文件,而是从这个事件通知里提取上传文件的桶名、文件路径(键),自动完成后续处理。
完整Lambda代码示例
import boto3 import pandas as pd import io def lambda_handler(event, context): # 从S3事件中提取上传文件的信息 s3_event = event['Records'][0]['s3'] source_bucket = s3_event['bucket']['name'] source_key = s3_event['object']['key'] # 跳过非JSON格式文件 if not source_key.endswith('.json'): return f"跳过非JSON文件:{source_key}" # 初始化S3客户端 s3_client = boto3.client('s3') # 读取S3中的JSON文件 try: json_object = s3_client.get_object(Bucket=source_bucket, Key=source_key) json_content = json_object['Body'].read() except Exception as e: return f"读取JSON文件失败:{str(e)}" # 解析JSON并转换为CSV try: df = pd.read_json(io.BytesIO(json_content)) csv_buffer = io.StringIO() df.to_csv(csv_buffer, index=False) except Exception as e: return f"JSON转CSV失败:{str(e)}" # 生成CSV文件名(替换原扩展名) target_key = source_key.rsplit('.', 1)[0] + '.csv' # 将CSV上传回S3(可修改为其他桶) try: s3_client.put_object( Bucket=source_bucket, Key=target_key, Body=csv_buffer.getvalue() ) return f"转换成功:{target_key}" except Exception as e: return f"上传CSV失败:{str(e)}"
关键配置步骤
- 准备Lambda层:Lambda默认环境没有
pandas,需要把pandas及其依赖包打包成Lambda层,或者使用AWS提供的公共pandas层(注意匹配Python版本)。 - 配置S3触发:打开目标S3桶的「事件通知」,添加新通知:
- 事件类型选择「所有对象创建事件」
- 目标选择「Lambda函数」,关联你创建的Lambda
- 配置Lambda权限:给Lambda的执行角色添加以下IAM权限:
s3:GetObject:允许读取源桶的JSON文件s3:PutObject:允许写入CSV文件到目标桶(可与源桶为同一个)
注意事项
- Lambda临时存储有限,全程用内存缓冲区(
io.BytesIO/io.StringIO)处理文件,不要写入本地文件 - 可通过修改
target_key或Bucket参数,将CSV文件保存到不同的S3桶或路径 - 测试时可用Lambda控制台的「测试事件」功能,模拟S3上传事件验证代码
内容的提问来源于stack exchange,提问作者RCat
相关产品推荐
相关产品推荐

