自定义并使用与CloudTrail集成的Elasticsearch Service
在中国,有一个相对广为人知的解决方案,可以将Amazon CloudTrail的日志投入Elasticsearch并在Kibana中进行易于查看。特别是最近,由于CloudWatch Logs具有”Streaming to Amazon Elasticsearch Service”功能,因此可以通过一键式操作在Kibana中进行可视化。具体来说,可以轻松完成Elasticsearch的新实例创建、从CloudWatch Logs发送日志到Elasticsearch的Lambda和所需IAM角色的设置。
引用:【应用】使用 CloudTrail 获取审计日志并在 ElasticSearch Service 中利用【简易设置】| Developers.IO
但是根据使用该功能创建的Elasticsearch配置,由于是自动创建,所以存在一些稍微困难的运维问题,以下是我总结的一些自定义点。
设置为”不分析”。
自动生成的Elasticsearch映射中没有设置任何not_analyzed。因此,即使区域名称是“ap”,“northeast”或“1”,它们都会被拆分成不同的部分进行图形化,这是很不幸的情况,需要进行改进。
由于CloudTrail记录中的字符串字段非常多,因此应用dynamic_templates来进行整理是最快的方法。索引会按日期进行切割,因此使用通配符”cwl-*”进行指定。
{
"template": "cwl-*",
"mappings": {
"_default_": {
"dynamic_templates": [
{ "es": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}}
]
}
}
}
用curl进行设置。
$ curl -XPUT xxx.es.amazonaws.com/_template/mapping -d @mapping.json
更改类型名称
在中国,以下为其本地化的方式之一:
对于 type,它通常会分配 CloudWatch Logs 的日志组名称,但是很少有情况下日志组名称中包含斜杠(应该是这样?)。因为 Elasticsearch 的 type 中含有斜杠实在是有些让人不舒服,所以将其更改为任意的值。
作为更改项,需要修改Lambda Function内的”Streaming to Elasticsearch Service”功能。由于”function transform”构建了发送到Elasticsearch的请求体(Request Body),所以需要修改以下部分。
var action = { "index": {} };
action.index._index = indexName;
action.index._type = "logs";
action.index._id = logEvent.id;
还有一个类似的地方,即可以在这里改变索引。默认情况下,日志会按照日期切割成不同的索引,并以cwl-YYYY.MM.DD的形式命名,但如果想要将它们合并到同一个索引中,可以通过指定固定值给indexName来实现。如果按照日期将索引分开,则在实现类似于对旧日志进行轮换的操作时,只需要删除相应的索引,非常方便。不过,这些问题可能是个人喜好的问题吧。
个人看法是,CloudTrail的日志是单独保存的,不需要在Elasticsearch中持久保存日志(只需在Kibana中可以查看最近1个月左右的日志即可)。因此,索引保持不变,我们通过定期外部cron发出删除请求来删除日志。虽然有设置文档过期时间的ttl功能,但据称已被弃用,因此我们没有采用该功能。
参考:TTL文档、盾牌和Found | 弹性搜索
集群健康状态的优化
默认创建的Elasticsearch Service实例,在仪表板上查看时,集群健康状态会变为”Yellow”。这是因为默认节点数为1,无法满足相同默认配置条件下的副本数=1。要解决这个问题,可以增加节点数量或将副本数设为0。但是如果只是CloudTrail日志的话,并不需要非常强大的容错能力,所以选择后者。
{
"template" : "*",
"settings" : {
"number_of_replicas" : 0
}
}
由于索引每天都会增加,因此将其设为默认设置。
$ curl -XPUT xxx.es.amazonaws.com/_template/replica -d @replica.json