首页 > 解决方案 > 使用 Lambda 与带有 CloudWatch 订阅过滤器的 Firehose 发布到 ElasticSearch

问题描述

我目前正在研究 CloudWatch 日志的实时处理。我们每天生成大约 30-40GB 的日志(API 网关完整请求/响应),平均每秒大约 100 个请求。最终,我们希望处理日志以从查询字符串和响应标头中提取统计信息,并将结果发布到 ElasticSearch 或 S3。

我目前正在研究两个选项并努力了解这些选项之间的区别

使用 Lambda 函数目标创建 CloudWatch 订阅过滤器。在 Lambda 中处理数据并发布到 ElasticSearch/S3。

创建 CloudWatch 订阅过滤器并从 Firehose 目标订阅。使用 Lambda 转换函数提取数据,将其放回流中,然后让 Firehose 将数据发布到 ElasticSearch/S3。

订阅过滤器将基本上传递包含“转换前的方法请求正文”和“端点响应标头:”的记录以进行进一步处理。

我对如何从 CloudWatch 订阅过滤器触发 Lambda 函数一无所知。是否涉及任何批处理,或者是否会为订阅过滤器传递的每个日志事件触发它?相反,我确实了解 Firehose 确实提供了批处理功能,我可以在一定程度上对其进行控制。

有人可以就此提供建议吗?还有其他我可能忽略的选项吗?感谢任何输入。

标签: elasticsearchamazon-cloudwatchamazon-kinesis-firehose

解决方案


您可以使用订阅过滤器将 cloudwatch 日志与 amazon kinesis 流连接起来。这样,每当新日志与订阅过滤器匹配时,它就会附加到您的 kinesis 流中。一旦您的日志位于 Kinesis 流中,您就有很多选择。例如,您可以将它们发送到 Kinesis Firehose Delivery Streams,并可能使用 Datatransformation lambda 或直接将它们转换为 Elastic Search 等

假设您已经拥有 cloudwatch 日志和 kinesis stream ,您需要的 cloudformation 资源如下:

  KinesisToCloudwatchSubscription:
    Type: AWS::Logs::SubscriptionFilter
    Properties:
      DestinationArn: !GetAtt [your_kinesis_stream, Arn]
      FilterPattern: your_cloudwatch_logstream
      RoleArn: A role that permits the "kinesis:PutRecord" action
      LogGroupName:  "/aws/lambda/your_lambda_function"

推荐阅读