7

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

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

这是我要完成的工作:

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

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

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

这可能吗?

4

4 回答 4

2

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

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

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

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

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

于 2017-09-28T02:50:33.277 回答
2

似乎是 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

希望能帮助到你。

于 2017-09-28T03:56:26.750 回答
2

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

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

我声明了两个 Elasticsearch 端点:

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

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

var endpoint = [endpoint1, endpoint2];

我修改了调用“buildRequest”函数的“post”函数,然后引用“endpoint”......

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

因此,每次调用“post”函数时,它都会在端点数组中循环。

然后,我修改了负责构建请求的 buildRequest 函数。这个函数默认调用端点变量,但由于“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>

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

谢谢大家!

于 2017-09-28T18:52:55.517 回答
1

截至 2020 年 9 月,CloudWatch 现在允许对单个 CloudWatch 日志组进行两次订阅,以及为单个日志组提供多个指标过滤器。

更新: AWS 于 2020 年 10 月 2 日在其“新增功能”博客上发布了“ Amazon CloudWatch Logs 现在支持每个日志组两个订阅过滤器”。

于 2020-09-08T18:28:43.830 回答