如何实现Rest API上传CSV文件至AWS Lambda处理并返回响应?
解决方案:用API Gateway直接集成Lambda同步处理CSV上传并返回结果
你之前的思路(S3触发Lambda)属于异步执行模式,确实没法直接给发起请求的用户返回响应。要实现同步返回处理结果,核心是让API Gateway直接调用Lambda,在Lambda内部完成文件解析、业务处理,再即时把结果返回给用户。具体实现步骤如下:
1. 配置API Gateway
- 创建一个POST类型的API端点,将请求内容类型设置为
multipart/form-data(支持文件上传场景) - 开启Lambda代理集成:把该API端点直接关联到你的目标Lambda函数,这样Lambda能获取到请求的完整上下文(包括上传的文件数据、请求头等)
2. 编写Lambda处理逻辑
Lambda需要解析multipart/form-data格式的请求,提取出CSV文件内容后执行业务处理,最后返回响应。以下是Python示例代码:
import csv import io def lambda_handler(event, context): # 提取请求基础数据 body = event['body'] is_base64 = event['isBase64Encoded'] content_type = event['headers'].get('Content-Type', '') # 处理base64编码的请求体 if is_base64: import base64 body = base64.b64decode(body).decode('utf-8') # 解析multipart boundary boundary = content_type.split('=')[1] if 'boundary=' in content_type else '' if not boundary: return {'statusCode': 400, 'body': '请求格式错误,需使用multipart/form-data类型'} # 拆分请求体,提取CSV文件内容 parts = body.split(f'--{boundary}') csv_content = None for part in parts: if 'filename=' in part and 'text/csv' in part: # 跳过文件元数据行,提取纯CSV内容 csv_part = part.split('\r\n\r\n')[1].rstrip('\r\n--') csv_content = csv_part break if not csv_content: return {'statusCode': 400, 'body': '未上传有效的CSV文件'} # 替换为你的实际业务处理逻辑,示例为统计数据行数 csv_reader = csv.reader(io.StringIO(csv_content)) header_row = next(csv_reader) # 跳过表头行 data_row_count = len(list(csv_reader)) # 返回处理结果 return { 'statusCode': 200, 'body': f'CSV处理完成:表头字段为{header_row},有效数据行数{data_row_count}' }
3. 配置权限
- API Gateway权限:在API Gateway关联Lambda时,AWS会自动生成调用Lambda的IAM权限,也可手动添加允许
lambda:InvokeFunction的策略 - Lambda执行角色:如果处理过程中需要读写S3、数据库等服务,给Lambda的执行角色添加对应权限即可
注意事项
- API Gateway的最大请求 payload 限制为10MB,若你的CSV文件超过这个大小,同步处理方式不适用。此时可改为:前端通过S3预签名URL上传文件到S3,再调用API触发Lambda处理,最后通过WebSocket或轮询API获取处理结果
- 若需要保留原始CSV文件,可在Lambda处理完成后,将文件上传到S3进行存档
内容的提问来源于stack exchange,提问作者sid8491
相关产品推荐
相关产品推荐

