我目前正在研究CloudWatch日志的实时处理。我们每天大约生成30-40GB的日志(API网关完整请求/响应),平均每秒约有100个请求。最终,我们希望处理日志以从查询字符串和响应标头中提取统计信息,并将结果发布到ElasticSearch或S3。
我目前正在研究两个选项,并努力了解这两个选项之间的区别
使用Lambda函数目标创建CloudWatch订阅过滤器。在Lambda中处理数据并发布到ElasticSearch / S3。
创建一个CloudWatch订阅过滤器并从Firehose目的地进行订阅。使用Lambda转换函数提取数据,将其放回流中,然后让Firehose将数据发布到ElasticSearch / S3。
订阅过滤器将基本上传递包含“转换前的方法请求主体”和“端点响应标头:”的记录,以进行进一步处理。
我对如何从CloudWatch订阅过滤器触发Lambda函数一无所知。是否涉及任何批处理,或者将由订阅筛选器传递的每个单个日志事件触发?相反,我确实知道Firehose确实提供了批处理,我可以在一定程度上控制它。
有人可以提供建议吗?还有其他我可能会忽略的选择吗?感谢任何输入。
答案 0 :(得分:0)
您可以使用订阅过滤器将cloudwatch日志与Amazon kinesis流连接。这样,每当新日志与订阅过滤器匹配时,它将被附加到您的运动流中。 一旦您的日志位于Kinesis流中,您将有很多选择。例如,您可以将它们发送到Kinesis Firehose Delivery Streams,并可以使用Datatransformation lambda对其进行转换,或者直接将其转换为Elastic Search e.t.c。
假设您已经有cloudwatch日志和kinesis流,则所需的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"