【问题标题】:Can Kinesis Firehose receive content uncompressed from CloudWatch Logs subscription?Kinesis Firehose 能否从 CloudWatch Logs 订阅接收未压缩的内容?
【发布时间】:2019-12-25 02:20:46
【问题描述】:

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

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

但是,此流程存在问题。我经常注意到 Lambda 转换函数失败,因为输出数据超过了 Lambda 同步调用的 6 MiB response payload limit。这是有道理的,因为输入被压缩但输出没有被压缩。这样做似乎是在 S3 中的结果对象上正确设置文件扩展名和 MIME 类型的唯一方法。

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

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

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-kinesis-firehose amazon-cloudwatchlogs


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      CloudWatch Logs 始终以压缩格式交付,从成本和性能的角度来看这是一个优势。但我理解您因在 S3 中没有正确的文件扩展名而感到沮丧。

      你可以做什么: 1) 让您的 lambda 在读取时解压缩并在写入时压缩。
      2) 在 ObjectCreate 上创建一个 S3 事件触发器,使用正确的扩展名重命名文件。由于 firehose 写入 S3 的方式,您不能使用后缀过滤器,因此您是 lambda,需要检查它是否已经进行了重命名。

      lambda 逻辑

      if object does not end .gz
      then
         aws s3 mv object object.gz
      end if
      

      【讨论】:

        猜你喜欢
        • 2021-11-05
        • 2020-11-10
        • 2019-05-07
        • 2020-10-06
        • 2017-10-16
        • 2019-11-05
        • 2017-05-27
        • 2020-06-09
        • 2020-08-12
        相关资源
        最近更新 更多