【问题标题】:AWS - subscribe multiple lambda logs to one elasticsearch serviceAWS - 将多个 lambda 日志订阅到一项弹性搜索服务
【发布时间】:2018-08-09 06:32:51
【问题描述】:

我有两个由两个不同的 lambda 生成的日志组。当我将一个日志组订阅到我的 elasticsearch 服务时,它正在工作。但是,当我添加另一个日志组时,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 服务中仍然拥有两个日志组,并可视化所有日志?

谢谢。

【问题讨论】:

    标签: amazon-web-services elasticsearch logging elastic-stack amazon-cloudwatch


    【解决方案1】:

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

    如果通过 AWS 控制台创建的默认 Lambda JS 文件会将索引类型设置为日志组名称。 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. 来自不同日志组的条目现在可以共存。

    【讨论】:

    • 太棒了,是的,我使用 ElasticSearch 6.0.0 运行它。感谢您的宝贵时间和解释清楚的答案!
    • 感谢出色的解决方案。 AWS 应在订阅云观察日志时对此进行说明。
    • 谁有更多关于第 2 步(重新索引今天的索引)的详细信息,比如一些说明或文档?
    • @Segfault 这指的是 Elasticsearch 的 Reindex API:elastic.co/guide/en/elasticsearch/reference/6.8/… 您设置了 sourcedest 索引,并且可以在 dest 中设置新的 type 值以重新索引为不同的类型
    【解决方案2】:

    您还可以修改生成的 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('.');
    

    【讨论】:

    • 最佳解决方案!
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      相关资源
      最近更新 更多