Amazon web services AWS-向一个elasticsearch服务订阅多个lambda日志
我有两个由两个不同lambda生成的日志组。当我向elasticsearch服务订阅一个日志组时,它正在工作。但是,当我添加其他日志组时,cloudwatch生成的日志中出现以下错误:Amazon web services AWS-向一个elasticsearch服务订阅多个lambda日志,amazon-web-services,elasticsearch,logging,elastic-stack,amazon-cloudwatch,Amazon Web Services,elasticsearch,Logging,Elastic Stack,Amazon Cloudwatch,我有两个由两个不同lambda生成的日志组。当我向elasticsearch服务订阅一个日志组时,它正在工作。但是,当我添加其他日志组时,cloudwatch生成的日志中出现以下错误: "responseBody": "{\"took\":5,\"errors\":true,\"items\":[{\"index\":{\"_index\":\"cwl-2018.03.01\",\"_type\":\"/aws/lambda/lambda-1\",\"_id\":\"33894733850010
"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进行了更改,允许索引仅包含一种映射类型。()我假设您正在运行一个使用版本6.0的ElasticSearch服务实例 默认Lambda JS文件(如果通过AWS控制台创建)将索引类型设置为日志组名称。JS文件的一个示例如下() 第86行:
action.index.\u type=payload.logGroup代码>
我个人使用了该脚本的修改版本,并将该行更改为:
action.index.\u type='cwl'代码>
我拥有来自不同日志组的日志,这些日志流式传输到同一ElasticSearch实例。将它们都设置为相同的类型是有意义的,因为它们都是CloudWatch日志,而不是将该类型设置为日志组名称。名称也在@log_group
字段中设置,以便查询可以使用该名称进行筛选
就我而言,我做了以下工作:
部署修改的Lambda
重新编制今天的索引(cwl-2018.03.07
)以更改类型
对于从
到cwl
来自不同日志组的条目现在将共存
您还可以修改生成的Lambda代码,如下所示,使其与多个CW日志组一起工作。如果Lambda函数可以为相同日志组下的不同日志流创建不同的ES索引,那么我们就可以避免这个问题。因此,您需要找到Lambda函数LogsToElasticsearch
,然后找到函数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日志-*)
我尝试了上述代码更改,但它只推送我配置的最后一个日志组
从AWS:默认情况下,只有1个日志组可以将日志数据流式传输到ElasticSearch服务。试图同时传输两个日志组将导致一个日志组的日志数据覆盖另一个日志组的日志数据
想看看我们是否有相同的解决方案。太棒了,是的,我用ElasticSearch 6.0.0运行它。谢谢你的时间和你解释得很好的答案!谢谢你提供的很棒的解决方案。AWS应该在云观察日志订阅时对此进行澄清。任何人都可以了解第2步(Reindex今天的索引)的更多详细信息,像一些说明或文档一样?@Segfault指的是Elasticsearch的Reindex API:您可以设置源
和dest
索引,并可以在dest
中设置一个新的类型
值,以作为不同类型的最佳解决方案重新索引!