CloudWatch 订阅过滤器:使用 lambda 或直接订阅

CloudWatch Subscription Filter: using lambda or direct subscription

我正在探索到 Firehose 的 CloudWatch Logs 流。到目前为止,据我所知,Cloudwatch 订阅过滤器是一个触发 lambda 以消化 CloudWatch 日志并将其发送到不同目的地(ElasticSearch 或 Firehose 或...另一个自定义 lambda)的事件。如果我错了,请纠正我。

我对 Cloudwatch Logs Stream to Firehose 这个案例的关注是:

1/ 在性能+定价方面,有什么区别:

2/ Firehose 从Cloudwatch 接收到的数据格式是什么?

如有任何建议,我们将不胜感激。

  1. In term of performance + pricing, is there any difference between [having a lambda vs. going straight to firehose?] :

是的。在性能方面,您会发现延迟稍大一些,因为您的数据在进入 firehose 之前必须通过 lambda,但延迟很可能根本无关紧要。您将获得灵活性,在您的 firehose 前面有一个可定制的处理步骤 - 一个执行额外转换或更智能过滤的机会。

注意,当直接发送到 firehose 时,您将 失去 CloudWatch 的自动压缩 - 如果您想要压缩,您必须自己设置(可能在 firehose 上)。此外,您需要为处理中间步骤的 lambda 调用付费。 Check the pricing page 看看这是否真的重要。

  1. Which data format does Firehose receive from Cloudwatch?

当直接使用 firehose 时,您会得到 firehose's output configuration(一堆记录附加在一个文件中),其中每条记录都是 CloudWatch 日志输出:

{
    "owner": "123456789012",
    "logGroup": "CloudTrail",
    "logStream": "123456789012_CloudTrail_us-east-1",
    "subscriptionFilters": [
        "Destination"
    ],
    "messageType": "DATA_MESSAGE",
    "logEvents": [
        {
            "id": "31953106606966983378809025079804211143289615424298221568",
            "timestamp": 1432826855000,
            "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}"
        },
        ...
    ]
}

(摘自the SubscriptionFilter docs

去 lambda 时:

The actual payload that Lambda receives is in the following format { "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} }

(也来自上面链接的文档)

其中 data 是上面的(编码、压缩)CloudWatch 输出对象。

鉴于你编写了 lambda,你可以输出任何你想要的到 firehose。请记住,firehose 将执行与上述相同的操作,将多条记录附加到每个输出文件中。


提醒一句:make sure to scale your firehose appropriately - 如果您不小心,并且规模不足,firehose puts 将开始失败,您将开始丢弃日志数据。确保您正在监控故障!