Kinesis Firehose 能否从 CloudWatch Logs 订阅接收未压缩的内容?

Nic*_*Nic 5 amazon-s3 amazon-web-services amazon-cloudwatchlogs amazon-kinesis-firehose

我正在使用 Kinesis Firehose 将应用程序日志从 CloudWatch Logs 复制到 S3 存储桶中。

  1. 应用程序日志写入 CloudWatch
  2. 日志组上的 Kinesis 订阅将日志事件拉入 Kinesis 流。
  3. Firehose 传输流使用 Lambda 函数来解压缩和转换源记录。
  4. Firehose 将转换后的记录写入启用了 GZIP 压缩的 S3 目标。

然而,这个流程有一个问题。我经常注意到 Lambda 转换函数会失败,因为输出数据超出了Lambda 同步调用的6 MiB 响应负载限制。发生这种情况是有道理的,因为输入被压缩但输出未被压缩。这样做似乎是在 S3 中的结果对象上正确设置文件扩展名和 MIME 类型的唯一方法。

有什么方法可以将未压缩的输入传递给 Lambda 转换函数吗?

这将对齐输入/输出大小。我已经尝试减少 Firehose 传输流上的缓冲区大小,但缓冲区大小限制似乎是针对压缩数据,而不是原始数据。

Nic*_*Nic 5

不,似乎无法更改 CloudWatch Logs 的输入是否被压缩。CloudWatch Logs 始终将 GZIP 压缩的有效负载推送到 Kinesis 流上。

如需确认,请查看 CloudWatch Logs 换行处理程序的 AWS 参考实现kinesis-firehose-cloudwatch-logs-processor。该处理程序接受 GZIP 压缩的输入并返回解压缩的消息作为输出。为了解决 6 MiB 限制并避免body size is too long错误消息,引用处理程序将输入分为两部分:适合 6 MiB 限制的有效负载和其余部分。使用 将剩余部分重新插入到 Kinesis 中PutRecordBatch