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

nuk*_*lov 6 lambda amazon-web-services amazon-cloudwatch aws-lambda

有没有一种方法可以将AWS Log Group流传输到多个Elasticsearch Services或Lambda函数?

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

这是我要完成的工作:

CloudWatch Log Group ABC->没有过滤器-> Elasticsearch Service#1

CloudWatch Log Group ABC->过滤器:“ XYZ”-> Elasticsearch Service#2

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

这可能吗?

nuk*_*lov 2

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

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

我声明了两个 Elasticsearch 端点:

var endpoint1 = '<ELASTICSEARCH ENDPOINT 1>';
var endpoint2 = '<ELASTICSEARCH ENDPOINT 2>';
Run Code Online (Sandbox Code Playgroud)

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

var endpoint = [endpoint1, endpoint2];
Run Code Online (Sandbox Code Playgroud)

我修改了“post”函数,该函数调用“buildRequest”函数,然后引用“端点”...

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

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

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

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

最后,我使用了 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>
Run Code Online (Sandbox Code Playgroud)

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

谢谢大家!