簡體   English   中英

AWS - 將多個 lambda 日志訂閱到一個 elasticsearch 服務

[英]AWS - subscribe multiple lambda logs to one elasticsearch service

我有兩個由兩個不同的 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 服務中仍然有兩個日志組,並可視化所有日志?

謝謝。

問題是 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. 來自不同日志組的條目現在將共存。

您還可以修改生成的 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 服務中。 嘗試同時流式傳輸兩個日志組將導致一個日志組的日志數據覆蓋另一個日志組的日志數據。

想檢查我們是否有相同的解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM