【问题标题】:Stream AWS CloudWatch Log Group to Multiple AWS Elasticsearch Services将 AWS CloudWatch 日志组流式传输到多个 AWS Elasticsearch 服务
【发布时间】:2018-03-09 14:50:47
【问题描述】:

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

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

这是我想要完成的:

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

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

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

这可能吗?

【问题讨论】:

    标签: amazon-web-services lambda aws-lambda amazon-cloudwatch aws-elasticsearch


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      我声明了两个 Elasticsearch 端点:

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

      然后,用端点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”函数时,它都会循环遍历 endpoints 数组。

      然后,我修改了负责构建请求的 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>
      

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

      谢谢大家!

      【讨论】:

      • 您介意在这里分享您如何处理套接字或 ECONNRESET 错误吗?还有你什么时候设置 context.succeed / context.failure 的?
      • 好吧,不知道你从中获得了什么,因为你的切入点仍然是一个?实际上只是简单地通知一个 SNS 并让其他功能订阅它对我来说似乎比你最终做的更清洁
      【解决方案3】:

      好像是 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

      希望对你有帮助。

      【讨论】:

      • 有趣。我从 CloudFormation 遇到了这个限制。奇怪的是 CLI 允许这样做。
      • 不幸的是,此解决方案似乎不起作用:调用 PutSubscriptionFilter 操作时发生错误 (LimitExceededException):超出资源限制。所以我们在控制台上得到了同样的消息。
      • 遗憾地确认了。除了某种原因,我没有收到错误,它只是默默地将订阅切换到新功能(在我的情况下是同一功能的别名)。通过日志组的支持票证订阅限制 1 确认。
      【解决方案4】:

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

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

      【讨论】:

      • 你能分享这个增强的官方文档/公告吗?顺便说一句:看起来新的默认限制是每个日志组 2 个过滤器订阅(我想这可以通过 AWS 支持票增加)。
      • @begie 到目前为止,我们还没有找到任何官方信息,您是对的 - 现在看起来最多 2 个。我们还没有通过我们的支持渠道收到回复以确认这一点是永久性更改,或者是否可以通过支持票修改限制
      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2017-09-30
      相关资源
      最近更新 更多