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

排查ECS容器日志发送至SQS队列后无法接收消息问题

报错原文:2021-10-06T22:16:30.330Z ERROR [input.s3] s3/collector.go:137 handleSQSMessage failed: json unmarshal sqs message body failed at offset 1 with syntax error: invalid character 'T' looking for beginning of value {"queue_url": "https://sqs.us-east-1.amazonaws.com/721086286010/filebeat-cloudtrail-sqs", "region": "us-east-1"}

故障定位思路

该报错核心是Filebeat的S3输入组件尝试将SQS消息体按JSON解析失败,消息体第一个有效字符为'T',不符合JSON首字符必须为{/[的语法要求,按以下步骤定位:

  • 先拉取SQS队列的原始消息验证格式,执行命令:
    aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/721086286010/filebeat-cloudtrail-sqs --max-number-of-messages 1
    查看返回结果里的Body字段,确认是否为合法JSON结构,是否直接写入了开头带时间标识的纯文本日志。
  • 核查ECS侧的日志发送逻辑:如果你的链路是ECS直接发日志到SQS,确认发送端有没有把日志内容封装为JSON结构;如果是ECS日志先写S3、再通过S3事件通知推送到SQS,确认S3事件通知的配置没有自定义修改消息体格式。
  • 排查IAM权限与SQS策略:确认ECS实例关联的IAM角色有sqs:SendMessage权限,SQS队列的访问策略允许对应角色写入,排除消息未实际写入队列、报错来自队列中残留的无效测试消息的情况。
修复方案
  • 若为S3事件通知链路:恢复S3事件通知的默认消息格式,Filebeat的S3输入采用默认配置即可,不要额外添加强制JSON解析的参数。
  • 若为ECS直写SQS链路:修改ECS侧的发送逻辑,把原始日志封装为合法JSON结构,示例结构如下:
    {"log_content": "原始日志内容", "timestamp": "2021-10-06T22:16:30.330Z", "ecs_instance_id": "实例标识"}
    确保整个消息体为标准JSON格式,首字符为{。
  • 快速验证可手动推送一条合法JSON消息到SQS队列,执行命令:
    aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/721086286010/filebeat-cloudtrail-sqs --message-body '{"test_key": "test_value"}'
    如果Filebeat能正常消费该消息,即可确认根因是上游发送的消息格式不符合要求。
  • 排查阶段可开启Filebeat的debug日志,启动时添加-d "input.s3"参数,会打印完整的SQS消息体内容,可直接查看错误格式的原始消息。

内容的提问来源于stack exchange,提问作者Evan Gertis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:24:05