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

时间:2017-09-28 00:58:59

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

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

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

以下是我要完成的事情:

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

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

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

这可能吗?

4 个答案:

答案 0 :(得分: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

希望它有所帮助。

答案 1 :(得分:2)

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

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

这两个Lambdas现在订阅了SNS主题而不是Log Group。

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

它不是一个完美的解决方案,但它是一个正常运作的解决方法,直到AWS允许多个Lambdas订阅同一个CloudWatch Log Group。

答案 2 :(得分:2)

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

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

我声明了两个Elasticsearch端点:

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

然后,声明一个名为“endpoint”的数组,其中包含endpoint1和endpoint2的内容:

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函数。默认情况下,此函数调用端点变量,但由于“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集群。

谢谢大家!

答案 3 :(得分:1)

从2020年9月开始,CloudWatch现在允许对一个CloudWatch Log组进行两次订阅,并为单个Log Group进行多个Metric筛选。

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