将 AWS CloudWatch 日志组流式传输到多个 AWS Elasticsearch 服务

Stream AWS CloudWatch Log Group to Multiple AWS Elasticsearch Services

有没有办法将 AWS 日志组流式传输到多个 Elasticsearch 服务或 Lambda 函数?

AWS 似乎只允许一个 ES 或 Lambda,此时我已经尝试了所有方法。我什至删除了 Log Group 的 ES 订阅服务,创建了单独的 Lambda 函数,创建了 CloudWatch Log Trigger,我只能在一个 Lambda 函数上应用相同的 CloudWatch Log 触发器。

这是我要实现的目标:

CloudWatch 日志组 ABC -> 无过滤器 -> Elasticsearch 服务 #1

CloudWatch 日志组 ABC -> 过滤器:"XYZ" -> Elasticsearch 服务 #2

基本上,我需要一个 ES 集群来存储所有日志,而另一个只需要一个过滤日志的子集。

这可能吗?

我也 运行 遇到了这个限制。我有两个 Lambda(做不同的事情)需要订阅同一个 CloudWatch 日志组。

我最终使用的是创建一个订阅日志组的 Lambda,然后将事件代理到 SNS 主题中。

这两个 Lambda 现在订阅了 SNS 主题而不是日志组。

对于过滤事件,您可以在 Lambda 中实现它们。

这不是一个完美的解决方案,但在 AWS 允许多个 Lambda 订阅同一个 CloudWatch 日志组之前,它是一个有效的解决方法。

似乎是 AWS 控制台限制,

你可以通过命令行来完成,

aws logs put-subscription-filter \
    --log-group-name /aws/lambda/testfunc \
    --filter-name filter1 \
    --filter-pattern "Error" \
    --destination-arn arn:aws:lambda:us-east-1:<ACCOUNT_NUMBER>:function:SendToKinesis

您还需要添加权限。

完整的详细说明,

http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html

希望对您有所帮助。

我能够通过 Lambda 函数使用一些变通方法并使用 Kannaiyan 提供的响应来解决问题。

我通过控制台创建了对ES的订阅,然后取消订阅,并修改了Lambda函数默认代码。

我声明了两个 Elasticsearch 端点:

var endpoint1 = '<ELASTICSEARCH ENDPOINT 1>';
var endpoint2 = '<ELASTICSEARCH ENDPOINT 2>';

然后,声明一个名为 "endpoint" 的数组,其中包含端点 1 和端点 2 的内容:

var endpoint = [endpoint1, endpoint2];

我修改了 "post" 函数,该函数调用 "buildRequest" 函数,然后引用 "endpoint"...

function post(body, callback) {
  for (index = 0; index < endpoint.length; ++index) {
    var requestParams = buildRequest(endpoint[index], body);
...

所以每次调用 "post" 函数时,它都会循环遍历 端点 的数组。

然后,我修改了负责构建请求的 buildRequest 函数。此函数默认调用 endpoint 变量,但由于 "post" 函数循环遍历数组,我将 "endpoint" 重命名为 "endpoint_xy" 以确保其不调用全局变量,而是将变量输入到函数中:

function buildRequest(endpoint_xy, body) {
  var endpointParts = endpoint_xy.match(/^([^\.]+)\.?([^\.]*)\.?([^\.]*)\.amazonaws\.com$/);
...

最后,我使用了 Kannaiyan 提供的关于使用 AWS CLI 实现日志订阅的响应,但更正了一些变量:

aws logs put-subscription-filter \
--log-group-name <LOG GROUP NAME> \
--filter-name <FILTER NAME> 
--filter-pattern <FILTER PATTERN> 
--destination-arn <LAMBDA FUNCTION ARN>

我暂时将过滤器完全打开,但现在将像 dashmug 建议的那样将过滤器直接编码到 Lambda 函数中。至少我可以把一个log拆分成两个ES集群

谢谢大家!

自 2020 年 9 月起,CloudWatch 现在允许对单个 CloudWatch 日志组进行两次订阅,以及对单个日志组使用多个指标过滤器。

更新:A​​WS 于 2020 年 10 月 2 日在其“最新消息”博客上发布了“Amazon CloudWatch Logs now supports two subscription filters per log group”。