繁体   English   中英

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

[英]Stream AWS CloudWatch Log Group to Multiple AWS Elasticsearch Services

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

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

这是我想要完成的:

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

CloudWatch 日志组 ABC -> 过滤器:“XYZ” -> Elasticsearch Service #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>';

然后,声明一个名为“端点”的数组,其中包含端点 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 函数。 该函数默认调用端点变量,但由于“post”函数循环遍历数组,我将“端点”重命名为“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 集群。

谢谢大家!

截至 2020 年 9 月,CloudWatch 现在允许对单个 CloudWatch 日志组进行两次订阅,并允许对单个日志组使用多个指标筛选器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM