AWS - 将多个 lambda 日志订阅到一个 elasticsearch 服务



我有两个由两个不同的lambda生成的日志组。当我为我的弹性搜索服务订阅一个日志组时,它正在工作。但是,当我添加另一个日志组时,我在cloudwatch生成的日志中出现以下错误:

"responseBody": "{"took":5,"errors":true,"items":[{"index":{"_index":"cwl-2018.03.01","_type":"/aws/lambda/lambda-1","_id":"33894733850010958003644005072668130559385092091818016768","status":400,"error":
{"type":"illegal_argument_exception","reason":"Rejecting mapping update to [cwl-2018.03.01] as the final mapping would have more than 1 type: [/aws/lambda/lambda-1, /aws/lambda/lambda-2]"}}}]}"

如何解决此问题,并且我的 Elasticsearch 服务中仍然同时具有两个日志组,并可视化所有日志?

谢谢。

问题在于 ElasticSearch 6.0.0 所做的更改允许索引仅包含单个映射类型。(https://www.elastic.co/guide/en/elasticsearch/reference/6.0/removal-of-types.html)我假设您正在运行使用版本 6.0 的 ElasticSearch 服务实例。

默认的 Lambda JS 文件(如果通过 AWS 控制台创建)会将索引类型设置为日志组名称。JS文件的一个示例是关于这个要点(https://gist.github.com/iMilnb/27726a5004c0d4dc3dba3de01c65c575)

第 86 行:action.index._type = payload.logGroup;

我个人正在使用该脚本的修改版本,并将该行更改为:

action.index._type = 'cwl';

我有来自不同日志组的日志流式传输到同一个 ElasticSearch 实例。让它们都是相同的类型是有意义的,因为它们都是 CloudWatch 日志,而不是让类型是日志组名称。该名称也在@log_group字段中设置,以便查询可以使用该名称进行筛选。

就我而言,我做了以下操作:

  1. 部署修改后的 Lambda
  2. 重新索引今天的索引(例如cwl-2018.03.07)以更改类型 适用于从<log group name>cwl的旧文档
  3. 来自不同日志组的条目现在将共存。

您还可以修改生成的 Lambda 代码,如下所示,使其适用于多个 CW 日志组。如果 Lambda 函数可以为同一日志组下的不同日志流创建不同的 ES 索引,那么我们可以避免这个问题。所以,你需要找到 Lambda 函数LogsToElasticsearch_<AWS-ES-DOMAIN-NAME>,然后函数function transform(payload),最后更改索引名称形成部分,如下所示。

// index name format: cwl-YYYY.MM.DD
//var indexName = [
//'cwl-' + timestamp.getUTCFullYear(),              // year
//('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
//('0' + timestamp.getUTCDate()).slice(-2)          // day
//].join('.');
var indexName = [
'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(),              // log group + year
('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
('0' + timestamp.getUTCDate()).slice(-2)          // day
].join('.');

是否可以将所有cloudwatch 日志组转发到 ES 中的单个索引?就像有一个索引"rds-logs-*"来流式传输我所有可用 RDS 实例的日志一样。 示例:所有 RDS 实例的错误日志、慢查询日志、通用日志等都需要推送到同一个索引下(RDS-logs-*)?

我尝试了上述代码更改,但它仅推送我配置的最后一个日志组。

从 AWS:默认情况下,只有 1 个日志组可以将日志数据流式传输到 ElasticSearch 服务。尝试同时流式传输两个日志组将导致一个日志组的日志数据覆盖另一个日志组的日志数据。

想检查我们是否有相同的解决方法。

相关内容

最新更新