如何在AWS Lambda中将S3中的AVRO文件转换为JSON格式?
读取S3中AVRO文件并转换为记录数组的解决方案
第一步:安装AVRO解析依赖
Lambda环境需要用到avsc库解析AVRO文件,你可以在本地项目执行npm install avsc,之后把依赖和Lambda代码一起打包部署,或者用Lambda层统一管理依赖。第二步:完整实现代码
下面是可直接运行的代码,核心是把S3返回的流转成Buffer,再用avsc解析成记录数组:
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; import { createDecoder } from 'avsc'; const client = new S3Client({}); export const handler = async (event) => { // 从S3触发事件中提取桶名和文件键 const s3Record = event.Records[0].s3; const parameters = { Bucket: s3Record.bucket.name, Key: s3Record.object.key }; try { const { Body } = await client.send(new GetObjectCommand(parameters)); // 将S3返回的可读流转换为Buffer const buffer = await streamToBuffer(Body); // 解析AVRO文件并收集所有记录 const decoder = createDecoder(buffer); const records = []; let currentRecord; while ((currentRecord = decoder.decode()) !== null) { records.push(currentRecord); } // 此处可对records数组做后续处理 console.log(`解析到${records.length}条记录`, records); return { statusCode: 200, body: JSON.stringify({ recordCount: records.length }) }; } catch (err) { console.error('处理AVRO文件失败:', err); return { statusCode: 500, body: JSON.stringify({ error: err.message }) }; } }; // 辅助函数:将可读流转换为Buffer function streamToBuffer(stream) { return new Promise((resolve, reject) => { const chunks = []; stream.on('data', chunk => chunks.push(chunk)); stream.on('end', () => resolve(Buffer.concat(chunks))); stream.on('error', reject); }); }
- 第三步:关键注意事项
- 若AVRO文件体积过大(超出Lambda内存限制),不要一次性转成Buffer,改用流式解析:
const decoder = createDecoder({ stream: Body }); // 后续循环解码逻辑不变 - 确保Lambda执行角色拥有
s3:GetObject权限,避免权限报错。 - 打包部署时,务必将
avsc依赖包含在内,或通过Lambda层关联到函数。
- 若AVRO文件体积过大(超出Lambda内存限制),不要一次性转成Buffer,改用流式解析:
内容的提问来源于stack exchange,提问作者Haumea
相关产品推荐
相关产品推荐

