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

AWS Firehose动态分区内联解析报错:非JSON记录问题排查

问题:AWS Firehose动态分区报错DynamicPartitioning.MetadataExtractionFailed,提示“Non JSON record provided”但实际发送JSON数据

我创建了采用动态分区与内联解析的Direct PUT模式AWS Firehose,通过Lambda从无法直接连接Firehose的事件源获取数据,再调用put_record_batch接口向Firehose发送JSON格式数据。按照官方文档配置了动态分区启用、多记录解聚合启用、JSON内联解析启用,并设置了基于customer_id的分区键与jq表达式.customer_id,但发送数据后收到DynamicPartitioning.MetadataExtractionFailed错误,S3中错误记录提示“Non JSON record provided”,明明发送的是JSON数据,请问问题出在哪里?


可能的问题原因及解决方法

  • Lambda发送的JSON未正确编码
    调用put_record_batch时,每条记录的Data字段要求是Base64编码的UTF-8字符串。如果Lambda直接传入原始JSON对象或未编码的字符串,Firehose会将其视为非JSON格式的原始字节,触发解析失败。
    解决:在Lambda中先将JSON对象序列化为UTF-8字符串,再进行Base64编码。例如Python中可使用:

    import json
    import base64
    
    record_data = {"customer_id": "123", "content": "test"}
    encoded_data = base64.b64encode(json.dumps(record_data).encode('utf-8')).decode('utf-8')
    
  • 多记录格式不符合NDJSON要求
    启用多记录解聚合后,Firehose期望每条记录是单行JSON(NDJSON格式)。如果你的批量数据是数组格式的JSON(比如[{"a":1},{"b":2}]),Firehose无法拆分单条记录,会把整个数组当作一条非JSON记录处理。
    解决:要么将每个JSON对象作为独立的Record元素传入put_record_batch,要么确保批量数据中每条JSON单独占一行。

  • JSON存在语法错误
    即使你认为是合法JSON,若存在语法问题(比如 trailing逗号、未闭合的引号、非标准的转义字符),Firehose的内联解析会判定为非JSON格式。
    解决:用JSON校验工具验证Lambda输出的JSON语法;同时检查是否有特殊字符未正确转义。

  • jq表达式与JSON结构不匹配
    若JSON数据中customer_id字段不存在、或嵌套在更深层级(比如.user.customer_id),而你配置的jq表达式是.customer_id,Firehose提取元数据失败时,可能会触发“Non JSON record provided”的误导性提示。
    解决:检查JSON实际结构,调整jq表达式匹配正确路径;可先用本地jq工具测试表达式是否能正确提取值。


内容的提问来源于stack exchange,提问作者Jake Boomgaarden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:54:55