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/ 在性能+定价方面,有什么区别:
- Cloudwatch 订阅过滤器 -> Firehose
- Cloudwatch 订阅过滤器 -> Lambda -> Firehose
2/ Firehose 从Cloudwatch 接收到的数据格式是什么?
- Cloudwatch 订阅过滤器 -> Firehose:我不知道
- Cloudwatch 订阅过滤器 -> Lambda -> Firehose:我认为 lambda 可以将日志转换为 JSON 然后将其放入 Firehose。
如有任何建议,我们将不胜感激。
- 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 看看这是否真的重要。
- 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 put
s 将开始失败,您将开始丢弃日志数据。确保您正在监控故障!
我正在探索到 Firehose 的 CloudWatch Logs 流。到目前为止,据我所知,Cloudwatch 订阅过滤器是一个触发 lambda 以消化 CloudWatch 日志并将其发送到不同目的地(ElasticSearch 或 Firehose 或...另一个自定义 lambda)的事件。如果我错了,请纠正我。
我对 Cloudwatch Logs Stream to Firehose 这个案例的关注是:
1/ 在性能+定价方面,有什么区别:
- Cloudwatch 订阅过滤器 -> Firehose
- Cloudwatch 订阅过滤器 -> Lambda -> Firehose
2/ Firehose 从Cloudwatch 接收到的数据格式是什么?
- Cloudwatch 订阅过滤器 -> Firehose:我不知道
- Cloudwatch 订阅过滤器 -> Lambda -> Firehose:我认为 lambda 可以将日志转换为 JSON 然后将其放入 Firehose。
如有任何建议,我们将不胜感激。
- 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 看看这是否真的重要。
- 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 put
s 将开始失败,您将开始丢弃日志数据。确保您正在监控故障!